繁体   English   中英

带VS2012的enable_if和构造函数

[英]enable_if and constructor with VS2012

我试图有条件地启用构造函数模板。 使用完全符合C ++ 11的编译器,我知道如何使用额外的默认模板参数来完成此操作。 但是,我需要支持VS2012,它具有std :: enable_if但不支持默认的函数模板参数。

使用C ++ 11,我会写以下内容:

template<typename T>
struct Class
{
  template<typename O, 
           typename = typename std::enable_if<std::is_convertible<O*, T*>::value>::type>
  Class(O*) {}
};

我尝试了以下方法,但它给出了错误C4336和各种后续错误:

template<typename T>
struct Class
{
  template <typename O>
  Class(O*, typename std::enable_if<std::is_convertible<O*, T*>::value>::type *= nullptr)
  {
  }
};

有没有办法让这个与VS2012一起工作?

增加

该课程的用法如下:

struct X { };
struct X2 : X { };
struct Y { };

struct Client
{
  Client(Class<X> x) {}
  Client(Class<Y> y) {}
};

void test() {
  X2* x2;
  Client client(x2); // error C2668: ambiguous call to overloaded function
                     // (without std::enable_if)
}

我担心,你必须使用辅助构造函数(我没有找到解决方法)。 但这样的事情应该有效:

#include <type_traits>

template<typename T>
struct Class
{
  template<typename O>
  Class(O* o) { construct(o, std::integral_constant<bool, std::is_convertible<T*, O*>::value>()); }

  template<class O>
  void construct(O*, std::true_type ) { /* convertible */ }
  template<class O>
  void construct(O*, ... ) { /* not convertible */ }
};

struct X { };
struct Y : public X { };

void check() {
  X x;
  int i;
  Class<Y> cl(&x);
  Class<Y> cl1(&i);
}

从C ++ 11开始,您还可以使用委托构造函数来执行此操作:

template<typename T>
class Class {
    template<typename O>
    Class(O *o, std::true_type) {}

    template<typename O>
    Class(O *o, std::false_type) {}

public:
    template<typename O>
    Class(O *o): Class(o, typename std::is_convertible<O*, T*>::type) {}
};

基本的想法是标签调度 ,也许它可以与VS2012一起使用。
有关详细信息,请参见此处

你是如此接近解决方案!

template<typename T>
struct Class
{
    template <typename O>
    Class(O*, typename std::enable_if<std::is_convertible<O*, T*>::value>::type * = nullptr)
    {
    }
};

你发现了差异吗? *=在参数列表中被解析为乘法/赋值运算符 ,而不是作为指针类型后跟默认参数。 因此,语法错误。

这是因为C ++解析器在形成令牌时被指定使用尽可能多的字符(即所谓的最大蒙克规则 )。 添加空格会按预期将其拆分为两个单独的标记。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM