c++ - enable_if 和构造函数与 VS2012

标签 c++ c++11 visual-studio-2012 enable-if

我正在尝试有条件地启用构造函数模板。使用完全兼容 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)
}

最佳答案

如此接近解决方案!

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

你发现区别了吗?参数列表中的 *= 被解析为 multiplication/assignment operator ,而不是后跟默认参数的指针类型。因此,语法错误。

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

关于c++ - enable_if 和构造函数与 VS2012,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40635870/

相关文章:

c++ - QHash 问题

visual-studio-2012 - 是否有适用于 VS 2012 的表达式树可视化工具?

php - 使用 Visual Studio 在 Cordova 中发生 HTTP POST 失败

c++ - 列表循环检测

c++ - 如何遍历类的实例集合并访问其模板成员

c++ - 将 unsigned char *buf=NULL 翻译成 Pascal?

c++11 - C++ 允许将数据移出类成员的最佳方法是什么(std::move 语法)

android - Android NDK 的最新 C++11 功能

c++ - 为什么 std::is_function 对简单函数和 lambda 返回 false?

visual-studio-2012 - 将数据集添加到RDLC报表时崩溃