使用SFINAE检测POD性的一种类型在C++
-
22-08-2019 - |
题
原来的标题是在这里 解决方法SFINAE中的错误VS2005C++
这是暂时使用的SFINAE使相当于is_pod模板类存在TR1(在VS2005有没有TR1)。它应该拥有它 值 成员真正当的模板参数是一个POD类型(包括原始的类型和结构作出的)和假时(如非微不足道的构造).
template <typename T> class is_pod
{
public:
typedef char Yes;
typedef struct {char a[2];} No;
template <typename C> static Yes test(int)
{
union {T validPodType;} u;
}
template <typename C> static No test(...)
{
}
enum {value = (sizeof(test<T>(0)) == sizeof(Yes))};
};
class NonPOD
{
public:
NonPod(const NonPod &);
virtual ~NonPOD();
};
int main()
{
bool a = is_pod<char>::value;
bool b = is_pod<NonPOD>::value;
if (a)
printf("char is POD\n");
if (b)
printf("NonPOD is POD ?!?!?\n");
return 0;
}
问题是,不仅VS2005年没有TR1,它不会关心联盟,以上(这不应该是有效的当模板参数是不是一个POD),因此两a和b评价,真的。
谢谢你的答案发表如下。仔细阅读他们(和代码)我意识到,我想做真是一个错误的做法。这个想法是结合SFINAE行为与适应的模板 must_be_pod (这是我找到书 不完善C++, 但它可以发现另一个地方,也是如此)。实际上,这将需要一个相当特定的规则SFINAE,这不是什么样的标准定义,很明显。这不是一个真正的错误中VS,之后。
解决方案
最大的问题与你的方法是你不做SFINAE在这里-SFINAE仅适用于参数类型和返回的类型在这里。
然而,所有SFINAE情况的标准,没有适用于你的情况。他们
- 阵列的空隙,引用、职能、或无效的尺寸
- 类型的构件,不是一个种类型
- 指针,以参考文献、引用的参考,引用的空隙
- 指针指向成员的非类型
- 无效转化的模板值参数
- 功能类型参数类型的空隙
- const/挥发性功能的类型
也许这就是为什么在提高文件,有的是:
一些没有(尚未)帮助 从编译器,ispod将永远不会 报告的这一类或结构是一个 荚;这始终是安全的,如果可能的话 子最佳的。目前(2005年)仅 MWCW9和视觉C++8有 有必要编译器_intrinsics.
其他提示
这不与VS2008工作,要么,但我怀疑你知道这一点。 SFINAE是推导模板参数模板参数;你真的不能推断的东西,透着一种类型的构造岬的类型,即使你可以创建一个类型,它是另一种类型不兼容(即工会不能使用非POD)。
在事实上,VS 2008使用的编译器支持的性状来实现std::tr1::type_traits
。
我不知道你想在这里做的SFINAE方式,因为is_pod<T>::test(...)
将匹配is_pod<T>::test(0)
了。或许,如果你使用一个不同的类型,而不是“廉政”,你会得到更好的匹配:
template <typename T> class is_pod
{
struct my_special_type { };
public:
typedef char Yes;
typedef struct {char a[2];} No;
template <typename C> static Yes test(my_special_type)
{
union {T validPodType;} u;
}
template <typename C> static No test(...)
{
}
enum {value = (sizeof(test<T>(my_special_type())) == sizeof(Yes))};
};
您可能也想看看 Boost.Enable_i F到做你SFINAE为你 - 除非你想实现自己的图书馆或因某些原因