Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是一个模板化函数,它支持C++;11?_C++_Templates_C++11_C Preprocessor_Generic Programming - Fatal编程技术网

C++ 是一个模板化函数,它支持C++;11?

C++ 是一个模板化函数,它支持C++;11?,c++,templates,c++11,c-preprocessor,generic-programming,C++,Templates,C++11,C Preprocessor,Generic Programming,从本质上说,我很好奇是否可以使用C++11模板,使模板化函数能够检测迭代器的间接寻址级别,并根据这一级别对函数进行不同的编译。例如,以下是一些无法编译的代码: #包括 #包括 #包括 #包括 结构MyStruct { int值; MyStruct(int value=42):value(value){} const int&getInt()const{return value;} }; typedef std::list StructList; typedef std::vector struc

从本质上说,我很好奇是否可以使用C++11模板,使模板化函数能够检测迭代器的间接寻址级别,并根据这一级别对函数进行不同的编译。例如,以下是一些无法编译的代码:

#包括
#包括
#包括
#包括
结构MyStruct
{
int值;
MyStruct(int value=42):value(value){}
const int&getInt()const{return value;}
};
typedef std::list StructList;
typedef std::vector strucptrvector;
模板
常量int和getIteratorInt(ITER\u型ITER)
{
if(std::is_指针::值)
return(*iter)->getInt();//不会编译->MyStruct没有运算符->定义
return iter->getInt();//不会编译->MyStruct*的间接寻址级别错误
}
模板
无效打印输入(常量列表\类型和输入列表)
{
对于(自动iter=intList.begin();iter!=intList.end();++iter)

std::cout当您想根据元函数(如
is_pointer
)在两个实现之间进行选择时,请使用
std::enable_if
,它根据SFINAE的原理工作

template <typename ITER_TYPE>
auto getIteratorInt(ITER_TYPE iter) ->
typename std::enable_if< std::is_pointer< 
        typename std::iterator_traits< ITER_TYPE >::value_type >::value,
    const int& >::type
{
  return (*iter)->getInt();
}

template <typename ITER_TYPE>
auto getIteratorInt(ITER_TYPE iter) ->
typename std::enable_if< ! std::is_pointer< 
        typename std::iterator_traits< ITER_TYPE >::value_type >::value,
    const int& >::type
{
  return iter->getInt();
}
模板
自动获取迭代(ITER\U类型ITER)->
如果::value\u TYPE>::value,
常量int&>::类型
{
return(*iter)->getInt();
}
模板
自动获取迭代(ITER\U类型ITER)->
typename std::enable_if<!std::is_pointer<
typename std::iterator\u traits::value\u TYPE>::value,
常量int&>::类型
{
返回iter->getInt();
}
这样,模板实例化只会看到对给定模板参数有效的代码行


我只是机械地将此修复应用于您的代码…我并不主张使用多个间接寻址,也不建议修复的实现是健壮的。

好吧,我想我只需要知道
如果
启用。\u。谢谢!实际上,SFINAE原则似乎在Visual Studio 2010上不起作用。thoug,它仍然无法编译h这可能是由于另一个线程造成的。@ComplexRobot很抱歉我以前没有测试它。问题是
*iter
声明了type
int const*const&
,它是对指针的引用,而不是指针。请谨慎地使用
decltype
。@potatosatter-Hm。如果iter\u type是指针而不是迭代器,它会工作吗?@ComplexRobot是的,这就是为什么要使用
std::iterator\u traits::value\u type
,而不是简单地使用
iter::value\u type