Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++ getter到可变容器-get<;0>;()只处理混凝土类型?_C++_Templates_Stdtuple - Fatal编程技术网

C++ getter到可变容器-get<;0>;()只处理混凝土类型?

C++ getter到可变容器-get<;0>;()只处理混凝土类型?,c++,templates,stdtuple,C++,Templates,Stdtuple,我需要一种特殊的变量容器,并且有一些不可预见的问题,因此我创建了以下最小示例(请参见注释): #包括 #包括 //--------------------------------------------------- 样板 类容器 { 使用ts_type=std::tuple; 公众: 容器()=默认值; 容器(Ts…Ts):Ts_{std::move(Ts)…}{ //获取#1:成员模板 样板 汽车 get()const->decltype(std::get(std::declval()){

我需要一种特殊的变量容器,并且有一些不可预见的问题,因此我创建了以下最小示例(请参见注释):

#包括
#包括
//---------------------------------------------------
样板
类容器
{
使用ts_type=std::tuple;
公众:
容器()=默认值;
容器(Ts…Ts):Ts_{std::move(Ts)…}{
//获取#1:成员模板
样板
汽车
get()const->decltype(std::get(std::declval()){
返回std::get(ts_);
}
//get#2:友元函数
样板
好友类型名称std::tuple\u元素::类型
get(常量容器和c){
返回std::get(c.ts_);
}
//get#3:带类型推断的友元函数
//不会编译
//错误:“const class container”没有名为“ts”的成员
//
//模板
//朋友汽车
//get(const容器&c)->decltype(std::get(c.ts)){
//返回std::get(c.ts_);
// }
私人:
ts_型ts_;
};
//---------------------------------------------------
//WTF?g++已经在抱怨声明
//我甚至没有尝试实例化foo
样板
void foo(施工测试与测试){
//错误:在“')标记之前应该有主表达式

std::cout您有一个可修复问题和一个不可修复问题:

foo
中,您需要告诉编译器您正在调用模板:
std::cout好的,现在可以了!谢谢你的帮助

#include <iostream>
#include <tuple>

//---------------------------------------------------
template<class...Ts>
class container
{
    using ts_type = std::tuple<Ts...>;

public:
    container() = default;

    container(Ts... ts) : ts_{std::move(ts)...} {}

    template<std::size_t index>
    auto 
    get() const -> decltype(std::get<index>(std::declval<const ts_type>())) {
        return std::get<index>(ts_);
    }

    template<std::size_t index, class... Us>
    friend auto 
    get(const container<Us...>& c) -> decltype(std::get<index>(c.ts_));

private:
    ts_type ts_;
};


template<std::size_t index, class... Us>
auto get(const container<Us...>& c) -> decltype(std::get<index>(c.ts_)) {
    return std::get<index>(c.ts_);
}


//---------------------------------------------------
template<class T>
void foo(const T& t) {
    std::cout << t.template get<0>() << std::endl;

    std::cout << get<0>(t) << std::endl;
}

//---------------------------------------------------
int main() {   
    auto c = container<int,double>{1, 2.5};

    std::cout << c.get<0>() << std::endl;
    std::cout << c.get<1>() << std::endl;

    std::cout << get<0>(c) << std::endl;
    std::cout << get<1>(c) << std::endl;

    foo(c);
}
#包括
#包括
//---------------------------------------------------
样板
类容器
{
使用ts_type=std::tuple;
公众:
容器()=默认值;
容器(Ts…Ts):Ts_{std::move(Ts)…}{
样板
汽车
get()const->decltype(std::get(std::declval()){
返回std::get(ts_);
}
样板
朋友汽车
get(const-container&c)->decltype(std::get(c.ts));
私人:
ts_型ts_;
};
样板
自动获取(const容器&c)->decltype(std::get(c.ts)){
返回std::get(c.ts_);
}
//---------------------------------------------------
样板
void foo(施工测试与测试){

std::cout第一个问题:
friend
函数的声明应该在类中声明并在类外定义。第二个问题:
t.get()
需要是
t.template get())
:第二个问题:是的-我太蠢了。你要做的另一件事就是给容器提供模板参数。谢谢你的t.template语法!我知道从模板类中获取模板类型时这是必要的,但我不知道你在这里也需要它。构造函数很好。我不想让它成为一个模板mplate并在签名中具有适当的参数类型。按值获取并移动到位就是我想要的。据我所知,您的提议不是完美的转发:因为ctor必须是一个模板容器(其他TS&&…)还是我错了?你说的“依赖于实例化”是什么意思?错误发生在任何foo实例化之前!
#include <iostream>
#include <tuple>

//---------------------------------------------------
template<class...Ts>
class container
{
    using ts_type = std::tuple<Ts...>;

public:
    container() = default;

    container(Ts... ts) : ts_{std::move(ts)...} {}

    template<std::size_t index>
    auto 
    get() const -> decltype(std::get<index>(std::declval<const ts_type>())) {
        return std::get<index>(ts_);
    }

    template<std::size_t index, class... Us>
    friend auto 
    get(const container<Us...>& c) -> decltype(std::get<index>(c.ts_));

private:
    ts_type ts_;
};


template<std::size_t index, class... Us>
auto get(const container<Us...>& c) -> decltype(std::get<index>(c.ts_)) {
    return std::get<index>(c.ts_);
}


//---------------------------------------------------
template<class T>
void foo(const T& t) {
    std::cout << t.template get<0>() << std::endl;

    std::cout << get<0>(t) << std::endl;
}

//---------------------------------------------------
int main() {   
    auto c = container<int,double>{1, 2.5};

    std::cout << c.get<0>() << std::endl;
    std::cout << c.get<1>() << std::endl;

    std::cout << get<0>(c) << std::endl;
    std::cout << get<1>(c) << std::endl;

    foo(c);
}