有没有办法比较decltype
C++11 中的结果?
换句话说,为什么这段代码无效:
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
.