Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 启用std::获取类上的支持_C++_C++11_Stdtuple - Fatal编程技术网

C++ 启用std::获取类上的支持

C++ 启用std::获取类上的支持,c++,c++11,stdtuple,C++,C++11,Stdtuple,为了支持std::get,我必须专门指定哪些模板 struct MyClass { int a; }; template <const size_t I> struct MyContainer { MyClass array[I]; }; struct MyClass{ INTA; }; 模板 结构MyContainer{ MyClass数组[I]; }; 我必须专攻什么才能做到: MyContainer<16> mc; std::get<0>(

为了支持std::get,我必须专门指定哪些模板

struct MyClass {
  int a;
};

template <const size_t I>
struct MyContainer {
  MyClass array[I];
};
struct MyClass{
INTA;
};
模板
结构MyContainer{
MyClass数组[I];
};
我必须专攻什么才能做到:

MyContainer<16> mc;
std::get<0>(mc);
MyContainer-mc;
std::get(mc);

std::get
不是标准库的自定义点;三个函数模板重载(对于
元组
数组
)不明确允许用户定义的重载,因此17.6.4.2.1p1适用,添加自己的函数模板重载声明是未定义的行为

注意,从C++17开始,
get
作为非限定的名称是一个定制点;协议使用它访问类似元组的元素;但这是一个非限定名,而不是限定名
std::get

也就是说,如果你要写:

namespace std {
   template<size_t I, size_t N> MyClass &get(MyContainer<N> &c) { return c.array[I]; }
}

我猜您想要实现一些算法,这些算法需要使用编译时索引访问任意数组(如容器),因此目标是使用一些函数(如
std::get
)来统一执行该任务?! 在这种情况下,这与将
开始
结束
用于您的课程是一样的。您只需在声明容器类的命名空间中声明一个函数
get
,并让ADL完成它的工作

    template <unsigned I, unsigned N>
    MyClass& get (MyContainer<N>& c) { return c.array[I]; }

    template <unsigned I, unsigned N>
    MyClass const& get (MyContainer<N> const& c) { return c.array[I]; }

我认为
std::get(…)
实际上只适用于
std::tuple
,最好为自定义类定义自己的函数。谢谢<代码>std::get不是一个定制点,这是我真正想知道的。这不是在C++17中的更改吗,这样用户就可以通过利用“
get(e)
的查找使自己的类与结构化绑定一起工作,其中get是通过依赖于参数的查找来查找的”?看,凯斯2@underscore_d不完全是,;这是
get
作为非限定名,而不是限定名
std::get
。这是一个重要的观点;谢谢@问题是get(e)不使用依赖于参数的查找,因为它会阻止ADL工作。(请看,这在C++20中是固定的,正如您在godbolt链接中将C++17更改为C++2a所看到的那样。)ADL不处理函数模板的显式实例化;在解析时,名称
get
不被识别为模板,因此尖括号被解析为比较运算符。(尝试将
MyContainer
放入命名空间。)
    template <unsigned I, unsigned N>
    MyClass& get (MyContainer<N>& c) { return c.array[I]; }

    template <unsigned I, unsigned N>
    MyClass const& get (MyContainer<N> const& c) { return c.array[I]; }
    int main(){
        std::array<int, 3> a {{0,1,2}};
        auto t = std::make_tuple(0.0, 1.0f, 2);
        auto p = std::make_pair('0', 4.4);
        MyContainer<3> c;

        std::cout << get<1>(a) << std::endl;
        std::cout << get<1>(t) << std::endl;
        std::cout << get<1>(p) << std::endl;
        std::cout << get<1>(c).a << std::endl;

        return 0;
    }