原来的标题是在这里 解决方法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为你 - 除非你想实现自己的图书馆或因某些原因

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top