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。