SFINAE:运算符上的 decltype []
SFINAE: decltype on operator[]
基于这里和这里的答案,我尝试使用以下
template <typename T>
using operator_square_brackets = decltype(&T::operator[]);
它在视觉工作室上失败
error C2760: syntax error: expected ')' not ']'
关于如何解决这个问题的任何想法?
如果要检测类型是否具有某个函数或重载运算符,则必须调用该函数或运算符。 这一点很重要,因为您可能有多个函数或运算符重载,并且重载解析始终取决于调用方。
下面是一个基于 CppCon 2014 的小示例:Walter E. Brown "Modern Template Metaprogramming: A Compendium, Part II",介绍如何检测类型中的operator[]
。
我不知道为什么VC会给你一个如此奇怪的错误,看起来更像是一个解析错误。 我本来希望诸如»无法解决对重载函数的引用之类的内容;你的意思是叫它吗?
#include <string>
#include <type_traits>
#include <vector>
// in C++17 std::void_t
template < typename... >
using void_t = void;
template < typename T, typename Index >
using subscript_t = decltype(std::declval<T>()[std::declval<Index>()]);
template < typename, typename Index = size_t, typename = void_t<> >
struct has_subscript : std::false_type {};
template < typename T, typename Index >
struct has_subscript< T, Index, void_t< subscript_t<T,Index> > > : std::true_type {};
struct A
{
void operator[](size_t) {}
};
struct B {};
int main ()
{
static_assert(has_subscript< std::vector<int> >::value == true , "!");
static_assert(has_subscript< std::vector<double> >::value == true , "!");
static_assert(has_subscript< A >::value == true , "!");
static_assert(has_subscript< A, std::string >::value == false, "!");
static_assert(has_subscript< B >::value == false, "!");
static_assert(has_subscript< double[5] >::value == true , "!");
static_assert(has_subscript< double* >::value == true , "!");
static_assert(has_subscript< double >::value == false, "!");
}
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- C++decltype和圆括号-为什么
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 有条件地选择带有 decltype() 和三元运算符的类型
- 不完整类型的调用运算符的 decltype 的特殊行为
- SFINAE:运算符上的 decltype []
- 为什么我不能对提取运算符进行 decltype
- 如何将 decltype 应用于运算符 [] 声明中的成员函数
- SFINAE decltype逗号运算符技巧
- decltype和C++中的scope运算符
- decltype,重载运算符的递归类型推导