Kar*_*nek 6 c++ sfinae template-meta-programming
我有以下模板类和它的类型的(全局)变量:
template <typename ClassT>
struct ClassTester : public ClassT {
typedef ClassT type;
};
ClassTester<int> *aaa; // No error here
Run Code Online (Sandbox Code Playgroud)
我期望编译错误,因为int无法派生,但这在Visual C++ 2010下编译得很好.
如果我删除指针,我得到预期的编译错误(int无法派生):
ClassTester<int> bbb; // Error here
Run Code Online (Sandbox Code Playgroud)
我想使用这个类进行SFINAE测试,给定的类型是否可以派生自以下类:
template <typename T>
struct CanBeDerivedFrom {
template <typename C>
static int test(ClassTester<T> *) { }
template <typename>
static char test(...) { }
static const bool value = (sizeof(test<T>(0)) == sizeof(int));
};
Run Code Online (Sandbox Code Playgroud)
然而,即使对于原始类型,例如int由于上述原因,这仍然是正确的.这是C++的预期/有效行为吗?
我认为不可能完全得到可以class通过 SFINAE 推导的 a (其中还包括 C++11 中的情况final class)。可以做的最好的事情是使用 SFINAE 来查找类型是否为 aclass并依赖它。
template<typename T>
struct void_ { typedef void type; };
template<typename T, typename = void>
struct CanBeDerivedFrom {
static const bool value = false;
};
template<typename T>
struct CanBeDerivedFrom<T, typename void_<int T::*>::type> {
static const bool value = true;
};
Run Code Online (Sandbox Code Playgroud)
该元程序将查找给定类型class/union是否是。演示。
| 归档时间: |
|
| 查看次数: |
424 次 |
| 最近记录: |