我需要根据这样的简单结构创建模板类。它有一个方法editor
来为其元组成员插入新元素。
AddNew
问题我不想在struct Type
{
int i;
char c;
};
template<typename ...T>
class A
{
std::tuple<T...> ts;
public:
A(T&&...t):ts(std::move(t)...){}
void AddNew(T t)
{
ts=std::tuple_cat(ts,t);
}
};
int main()
{
A<Type,Type,Type,Type> a({1,'a'},{2,'t'},{3,'c'},{4,'g'});
Type t{5,'x'};
a.AddNew(t);
}
中写下Type
... 4次。当我使用4 main
s A<Type,4>
或A
初始化Type
时,我喜欢A<Type, 100>
之类的内容。
答案 0 :(得分:3)
你可能只想要矢量:
struct Type
{
int i;
char c;
};
template<typename T>
class A
{
std::vector<T> data;
public:
template <typename ... Ts>
A(Ts&&...ts) : data(std::forward<Ts>(ts)...){}
void AddNew(const T& t)
{
data.push_back(t);
}
};
int main()
{
A<Type> a(Type{1,'a'}, Type{2,'t'}, Type{3,'c'}, Type{4,'g'});
Type t{5,'x'};
a.AddNew(t);
}
答案 1 :(得分:0)
你可以将A部分专门用于帮助某些帮助者标记&#39;类型:
template<typename T, std::size_t N>
struct repeat{};
template<typename... T>
struct repeat_unpack{ using type = A<T...>; };
template<typename T, int N, typename... V >
struct repeat_unpack<repeat<T,N>,V...>: std::conditional_t<(N>1),
repeat_unpack<repeat<T,N-1>,T,V...>,
repeat_unpack<T,V...>
>{};
template<typename T, int N>
class A<repeat<T,N>>: repeat_unpack<repeat<T,N>>::type {};
// to be used as
A<repeat<Type,3>>
以上使用继承来避免代码重复,因此您可能需要将某些成员(例如构造函数)提升为部分特化。 否则,只需使用别名
template<class T, std::size_t N>
using A_nth = typename repeat_unpack<repeat<T,N>>::type;
A_nth<Type,3>
还有一件事,鉴于你在内部使用元组,应该很容易简单地专门用于std :: array并使用它代替,是元组兼容...
PS。显然,您的AddNew()
代码没有任何意义,我认为它只是一个代码段错误...