我正在尝试实现一个使用sfinae区分数组和非数组类型的模板对类。到目前为止,我有以下代码:

template <typename T>
class pair
{
public:

   //default constructors. one for non-array types and one for arrays. These work.
   template <typename temp_type = T>
   pair(typename boost::disable_if<boost::is_array<temp_type>>::type* ignore = 0)
      : first(T())
      , second(T())
   {}

   template <typename temp_type = T>
   pair(typename boost::enable_if<boost::is_array<temp_type>>::type* ignore = 0)
   {}

   //assignment operator attempts for non-array types (not in code at same time.) These don't work.
   template<typename temp_type = T>
   pair<temp_type>& operator=(pair<typename boost::disable_if<boost::is_array<temp_type>>::type>                const& rhs)
   {
       this->first = rhs.first;
       this->second = rhs.second;
       return *this;
   }

   template<typename temp_type = T>
   auto operator=(pair<temp_type> const& rhs) -> pair<typename boost::disable_if<boost::is_array<temp_type>>::type>&
   {
       this->first = rhs.first;
       this->second = rhs.second;
       return *this;
   }

   T first;
   T second;
};

赋值运算符的第一次尝试失败,并出现“非法使用void类型”错误。第二个编译,但是当我调试时,MSVC告诉我“该行没有关联的可执行代码”。我正在使用MSVC 12 64位编译器。

如果您可以提供有关此处错误之处的任何见解,那将非常有帮助。

另外,我对C++中的sfinae所做的一些观察(可能是对还是错):
  • sfinae要求对成员函数进行模板化,但不能为此目的使用类模板类型。为什么?
  • 只能通过修改模板参数而不是返回类型或输入来完成
  • sfinae。究竟如何运作?这种方法的灵活性是什么?

  • 我知道这很漫长,并且在许多其他文章中都涉及了引用主题,但是我无法以一种简洁地解释c++ sfinae的方式将这些解释放在一起。

    我读过的一些文章:

    Explain C++ SFINAE to a non-C++ programmer(高级简介)

    Select class constructor using enable_if(构造函数的定义)

    谢谢你的帮助。

    编辑:

    我已根据以下注释修改了代码,但仍无法按预期运行(编译器甚至看不到源代码。)这是一种有趣的情况,因为该示例是完全人为设计的,并且默认赋值运算符实际上可以工作在这种情况下。不过,我认为编译器不应取代我重载运算符的尝试。

    我尝试了以下4种方法,但似乎没有一个内置于可执行文件中:
    template<typename temp_type = T>
    pair<temp_type>& operator=(pair<typename boost::disable_if<boost::is_array<temp_type>, temp_type>::type> const& rhs)
    
    {
            this->first = rhs.first;
            this->second = rhs.second;
            return *this;
    }
    
    template<typename temp_type = T>
    auto operator=(pair<temp_type> const& rhs) -> pair<typename boost::disable_if<boost::is_array<temp_type>, temp_type>::type>&
    {
        this->first = rhs.first;
        this->second = rhs.second;
        return *this;
    }
    
    template<typename ret_type = boost::disable_if<boost::is_array<T>, T>::type, typename = void>
    pair<ret_type>& operator=(pair<ret_type> const& rhs)
    {
        this->first = rhs.first;
        this->second = rhs.second;
        return *this;
    }
    
    template<typename temp_type = T, typename boost::enable_if<boost::is_array<temp_type>, temp_type>::type = 0>
    pair<T>& operator=(pair<temp_type> const& rhs)
    {
        this->first = rhs.first;
        this->second = rhs.second;
        return *this;
    }
    

    有什么想法吗?

    最佳答案

    别忘了,转换分配可以通过模板功能实现,但是复制和移动分配操作符则不能。

    和笔记

    (在第12.8节中找到引号,n3936草案的措词)

    关于c++ - SFINAE具有 boost 启用,如果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26301674/

    10-12 17:28