我正在尝试实现一个使用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所做的一些观察(可能是对还是错):
我知道这很漫长,并且在许多其他文章中都涉及了引用主题,但是我无法以一种简洁地解释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/