有沒有辦法在C++ 11中比較decltype
的結果?decltype比較
換句話說,這是爲什麼代碼無效:
template<typename T, typename U>
void func(T& t, U& u) {
if(decltype(t) == decltype(u)) {
// Some optimised version for this case
} else {
// A more general case for differing types
}
}
我知道,在某些情況下,這種特殊的問題可以通過模板偏特化來解決;我的問題是關於decltype
s的比較。
編輯:在試圖通過SFINAE提供免費函數的默認過程中出現了這個問題。也許是一個更好的問題將是爲什麼這是無效的:
template<bool B>
bool SomeFunction() { ... }
template<typename T, typename U>
bool SomeFunctionWrapper(T& t, U& u) {
SomeFunction<decltype(t) == decltype(u)>();
}
因爲我已經發現了另一種解決方案(不涉及在所有模板),但是在一個階段我嘗試這樣做:
// If it exists, the free function is defined as
// bool AFreeFunction();
typedef struct { char } undefined;
template<typename T = void>
undefined AFreeFunction();
template<bool B>
bool AFreeFunctionWrapper_() {
return false;
}
template<>
bool AFreeFunctionWrapper_<false>() {
return AFreeFunction();
}
bool AFreeFunctionWrapper() {
return AFreeFunctionWrapper_<decltype(AFreeFunction()) == decltype(undefined)>();
}
我最終得到了一個使用GCC 4.6的策略的變體,但後來發現默認模板參數不允許用於MSVC中的模板函數,即使在2012 RC中也是如此。因此,最終的解決方案如下所示:
class AFreeFunction {
public:
operator bool() { return false; }
};
如果函數被定義,它會被調用。如果不是,則將其解釋爲該類的構造函數,然後將其隱式轉換爲bool
。
請注意,上面的自由函數形式不能用部分專業化來解決;它需要重新配置爲允許它的類模板。 – Tom 2012-08-08 09:34:10
不,它不需要是類模板,它可以是一組簡單的*重載*函數模板。 – 2012-08-08 10:00:03
@ n.m。好點子。 – Tom 2012-08-08 16:30:20