我想编写函数模板一样如何检测运算符[]是否适用于Type?
template< typename T >
void foo(T& obj){
obj[0] = xxxxxx;
}
其中T必须具有操作员[]适用。
T可以是任何类型的数组,std :: vector,std :: array或任何其他类型。所以,我不能用T作为他们所有人的超类。我认为这应该是在std::type_traits风格。
我想编写函数模板一样如何检测运算符[]是否适用于Type?
template< typename T >
void foo(T& obj){
obj[0] = xxxxxx;
}
其中T必须具有操作员[]适用。
T可以是任何类型的数组,std :: vector,std :: array或任何其他类型。所以,我不能用T作为他们所有人的超类。我认为这应该是在std::type_traits风格。
template<class T>
using LvalueIndexable = decltype(std::declval<T&>()[1]);
template<class T, class U = void>
using RequiresLvalueIndexable
= typename std::enable_if<std::experimental::is_detected<LvalueIndexable, T>{},
U>::type;
template< typename T, typename = RequiresLvalueIndexable<T> >
void foo(T& obj){
obj[0] = xxxxxx;
}
查看cppreference page了解如何实施std::experimental::is_detected
。
出了什么问题只是写的代码是什么? –
没有错,但如果可能我想限制错误的类型。 – kyb
@kyb好吧,这些将被限制(除非你想排除纯指针类型)。你想要更好的错误信息吗? –