例如,我有一堂课
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...);
我的问题是在实现方法时如何将成员类型链接到正确的成员。谢谢!
答案 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)