作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
SFINAE 原则不适用于 Visual Studio 2010 中看似非常简单的内容。
#include <type_traits>
#include <iostream>
struct MyStruct
{
int value;
MyStruct(int value = 42) : value(value) { }
const int& getInt() const { return value; }
};
template <typename ITER_TYPE>
auto getIteratorInt(ITER_TYPE iter) ->
typename std::enable_if
<std::is_pointer<decltype(*iter)>::value, const int&>::type
{
return (*iter)->getInt();
}
template <typename ITER_TYPE>
auto getIteratorInt(ITER_TYPE iter) ->
typename std::enable_if
<!std::is_pointer<decltype(*iter)>::value, const int&>::type
{
return iter->getInt();
}
int main(void)
{
MyStruct gloryInt;
MyStruct* gloryIntPtr = &gloryInt;
std::cout << getIteratorInt(gloryIntPtr) << std::endl;
std::cout << getIteratorInt(&gloryIntPtr) << std::endl;
return 0;
}
我的意图是使用 std::enable_if
根据 SFINAE 原理编译正确的模板重载。 (没有返回类型的函数将被忽略,另一个将被编译。)这样,您可以使用指向对象的指针或双指针,直接对象仍然是访问的对象。
我得到以下编译错误:
main.cpp(14): error C2039: 'type' : is not a member of 'std::tr1::enable_if<_Test,_Type>'
with
[
_Test=false,
_Type=const int &
]
main.cpp(17): error C3646: 'type' : unknown override specifier
好吧,如果不使用 SFINAE,这是一个非常明显的错误。有什么方法可以在 Visual Studio 2010 中获得预期的功能?
最佳答案
嘿,应该在更新其他答案之前查看您的个人资料页面。
类型decltype( * iter )
指的是int const *const &
,它是对指针的引用,而不是“裸”指针。因此 std::is_pointer
返回一个意外的结果。有两种方法可以解决这个问题:
使用 C++03 中的 std::iterator_traits
,我更喜欢它:
typename std::iterator_traits< ITER_TYPE >::value_type
使用 std::decay
元函数去除引用 decltype
可能添加以反射(reflect)表达式的值类别
typename std::decay< decltype( * iter ) >::type
关于c++ - SFINAE 不适用于 Visual Studio 2010 for std::is_pointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10086286/
我是一名优秀的程序员,十分优秀!