Как сделать метод set <T>(args ...)? - PullRequest
0 голосов
/ 15 ноября 2018

Например, у меня есть класс

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 голосов
/ 15 ноября 2018

Если вы не хотите использовать подход tuple, один из способов сделать это - предоставить приватные методы получения для каждого члена, перегруженные типом тега:

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 ++).

0 голосов
/ 15 декабря 2018

[введите описание ссылки здесь] [۱

**

** сильный

**

1 : http://www.google play.com

enter code here цитата

  1. [Элемент списка] [۱]
0 голосов
/ 15 ноября 2018

Я бы заполнил std::tuple<MemberType1*, MemberType2*, ...> в ctor, так что вы можете использовать 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)

...