2016-05-01 27 views
1

我想编写函数模板一样如何检测运算符[]是否适用于Type?

template< typename T > 
void foo(T& obj){ 
    obj[0] = xxxxxx; 
} 

其中T必须具有操作员[]适用。
T可以是任何类型的数组,std :: vector,std :: array或任何其他类型。所以,我不能用T作为他们所有人的超类。我认为这应该是在std::type_traits风格。

+0

出了什么问题只是写的代码是什么? –

+0

没有错,但如果可能我想限制错误的类型。 – kyb

+0

@kyb好吧,这些将被限制(除非你想排除纯指针类型)。你想要更好的错误信息吗? –

回答

2
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

1

有几种方法来限制模板类型:

1)声明该函数模板作为私有类的方法,然后从公共重载方法调用它,如所述here;

2)使用Boost静态断言和is_base_of比较模板和类型,请参阅here;

3)或包括type_traits和使用断言static_assert(is_same<T, float>::value, "Error message");

相关问题