gpt4 book ai didi

c++ - SFINAE 不适用于 Visual Studio 2010 for std::is_pointer

转载 作者:行者123 更新时间:2023-11-30 04:28:30 28 4
gpt4 key购买 nike

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com