假设我有一个类型T,我想检测它是否有一个下标操作符,我可以用另一种类型调用它Index.以下示例工作得很好:
#include <type_traits>
#include <vector>
template < typename T, typename Index >
using subscript_t = decltype(std::declval<T>()[std::declval<Index>()]);
int main()
{
using a = subscript_t< std::vector<int>, size_t >;
using b = subscript_t< std::vector<int>, int >;
}
Run Code Online (Sandbox Code Playgroud)
但是,当且仅当函数签名完全匹配时,我希望检测函数.在上面的例子中,我希望语句subscript_t< std::vector<int>, int >;抛出一个错误no viable overloaded operator[],因为下标运算符的签名std::vector是
std::vector<T, std::allocator<T>>::operator[](size_type pos);
Run Code Online (Sandbox Code Playgroud)
size_typeGCC 在哪里unsigned long.如何避免隐式转换从int到size_t要发生?