initializer_list与其他参数结合使用

Mar*_*zog 4 c++ initialization c++11

假设我有一个类,它接受类型T的参数和U构造函数中类型的参数集合.以下解决方案有效:

struct Q
{
    Q(T t, std::initializer_list<U> us);
};
Run Code Online (Sandbox Code Playgroud)

然后创建此类的实例将是:

Q q {t1, {u1, u2, u3, u4} };

但这对我来说看起来有点不洁净.有没有比这个更好的解决方案?

小智 8

你需要的是可变参数模板(c ++ 11特性).

#include <initializer_list>

struct T {};
struct U {};

class Q {
 public:
  template <class ...ArgTypes>
  Q(T t, ArgTypes... args) : Q(t, {args...}) {}
 private:
  Q(T t, std::initializer_list<U> us) {}
};

int main() {
  T t1;
  U u1, u2, u3, u4;
  Q {t1, u1, u2, u3, u4};
}
Run Code Online (Sandbox Code Playgroud)

它仍然是类型安全的 - 只U允许类型的结构.