Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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++ 如何制作套装<;T>;(args…)方法?_C++_C++11_Templates_C++14 - Fatal编程技术网

C++ 如何制作套装<;T>;(args…)方法?

C++ 如何制作套装<;T>;(args…)方法?,c++,c++11,templates,c++14,C++,C++11,Templates,C++14,例如,我有一门课 class A { public: template<class T, class... Args> void set(Args&&... args); private: std::shared_ptr<Member1Type> m_member1; std::shared_ptr<Member2Type> m_member2; // Member types are all differen

例如,我有一门课

class A
{
public:
    template<class T, class... Args>
    void set(Args&&... args);

private:
    std::shared_ptr<Member1Type> m_member1;
    std::shared_ptr<Member2Type> m_member2; // Member types are all different.
};
A类
{
公众:
模板
无效集(Args&…Args);
私人:
std::共享成员1;
std::shared_ptr m_member2;//成员类型都不同。
};
我希望我能把它当作

A a;
a.set<Member1Type>(args... to construct Member1Type);
A;
a、 设置(参数…用于构造Member1Type);
哪个喜欢

make_shared<T>(args...);
make_shared(args…);

我的问题是如何在实现该方法时将成员类型链接到正确的成员。谢谢

我会在ctor中填充一个
std::tuple
,这样您就可以在
a::set

[编辑] 或者如StoryTeller所建议的,没有额外的成员:

private:
    std::tuple <
        std::shared_ptr<Member1Type>,
        std::shared_ptr<Member2Type>
    > m_members;
private:
std::tuple<
std::共享ptr,
std::共享的ptr
>m_成员;

您现在需要
std::get(m_成员)

如果您不想使用
tuple
方法,一种方法是为每个成员提供私有getter,在标记类型上重载:

template <typename T> struct type_t { };
template <typename T> constexpr type_t<T> type{};

class A
{
public:
    template<class T, class... Args>
    void set(Args&&... args) {
        get(type<T>) = std::make_shared<T>(std::forward<Args>(args)...);
    }

private:
    auto& get(type_t<Member1Type>) { return m_member1; }
    auto& get(type_t<Member2Type>) { return m_member2; }

    std::shared_ptr<Member1Type> m_member1;
    std::shared_ptr<Member2Type> m_member2;
};
模板结构类型{};
模板constexpr type_t type{};
甲级
{
公众:
模板
无效集(Args&&…Args){
get(type)=std::make_shared(std::forward(args)…);
}
私人:
自动获取(type_t){return m_member1;}
自动获取(type_t){return m_member2;}
std::共享成员1;
std::共享成员2;
};

>代码> Auto&Read避免再次写入该类型的需要,该类型已经出现在参数列表中(与在编写C++ CAST时不重复类型相同)。

[进入链接描述这里] [< < /P> > > **

**强壮的

**

:play.com

在此处输入代码
quote

  • [列表项目][۱]

  • 您可以提供一个to
    set
    来告诉它要设置哪个成员。但要做到这一点,您需要公开成员,包括它们的基础类型,在这一点上,尝试用setter封装它实际上没有任何意义。请注意,这仅在每个成员具有不同类型并且使编译器生成的cons无效时才起作用卡车司机和赋值操作符。他们会复制或赋值
    元组,元组指向引用实例的成员,而不是赋值或构造实例的成员。@StoryTeller:啊,我明白你的意思了。我的逻辑是
    m_member1
    可能是一个空的共享\u ptr,所以我不能使用引用。但是你可以删除单个成员,并将共享\u ptr直接存储在元组中。@m如果原始指针的生存期与现有的
    共享\u ptr
    相耦合,则没有理由共享所有权。原始指针在不拥有所有权的情况下是完全正确的。编辑:尽管您可能需要指向
    共享\u ptr*的元组de>而是允许您分配给它。@FrançoisAndrieux:唯一性是指需要通过
    set
    的单个参数
    T
    来选择成员。我发现tuple没有这样的get()成员方法。我需要的是找到类型的索引,然后调用std::get(m_members)方法,对吗?谢谢!我在想第二行是什么?一个全局变量?@user1899020a。