gpt4 book ai didi

c++ - SFINAE:运算符 [] 上的 decltype

转载 作者:可可西里 更新时间:2023-11-01 17:44:19 24 4
gpt4 key购买 nike

基于答案 herehere我正在尝试使用以下内容

template <typename T>
using operator_square_brackets = decltype(&T::operator[]);

它在 visual studio 上失败了

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++ - SFINAE:运算符 [] 上的 decltype,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45230947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com