如何使set <t>(args ...)方法?

时间:2018-11-15 15:08:34

标签: 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 different.
};

我希望我可以将其用作

A a;
a.set<Member1Type>(args... to construct Member1Type);

喜欢

make_shared<T>(args...);

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

3 个答案:

答案 0 :(得分:7)

我会在ctor中填充一个std::tuple<MemberType1*, MemberType2*, ...>,因此您可以在get<T*>(m_tuple)中使用A::set<T, Args...>

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

private:
    std::tuple <
        std::shared_ptr<Member1Type>,
        std::shared_ptr<Member2Type>
    > m_members;

您现在需要std::get<std::shared_ptr<T>>(m_members)

答案 1 :(得分:3)

如果您不想采用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;
};

auto&返回避免了再次写入类型的需要,该类型已经出现在参数列表中(有点类似于您在编写C ++类型转换时不会重复该类型的方式)。

答案 2 :(得分:-1)

[在此输入链接描述] [۱

**

**强

**

1http://www.google play.com

  

enter code here引用

  1. [列表项] [۱]