如何检测operator []是否适用于Type?

时间:2016-05-01 06:32:40

标签: c++ templates c++11 operator-overloading typetraits

我想编写像

这样的函数模板
public function messages()
{
    return [
        'password.required' => 'The password field is required.',
        'password_confirmation.required'  => 'The password confirmation field is required.',
    ];
}

其中T必须适用operator [] T可以是任何类型的数组,std :: vector,std :: array或任何其他类型。所以,我不能使用T作为所有这些的超类。我认为它应该像std::type_traits样式。

2 个答案:

答案 0 :(得分:3)

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)

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

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

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

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