简化模板参数

时间:2017-12-13 08:22:07

标签: c++ variadic-templates

我需要根据这样的简单结构创建模板类。它有一个方法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>之类的内容。

2 个答案:

答案 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()代码没有任何意义,我认为它只是一个代码段错误...