通过将相同数量的构造函数参数传递给每个元素来构造一个元组

Construct a tuple by passing a the same variable number of constructor arguments to each element

我试图通过将相同的构造函数参数传递给每个元素来构造一个元组。

为了便于说明,我有 2 个 classes,它们可以接受任意数量的构造函数参数:

struct Foo
{
    template<typename... Args>
    Foo(Args... args)
    {
      std::cout << "Foo " << (... << args) << '\n';
    }
};

struct Bar
{
    template<typename... Args>
    Bar(Args... args)
    {
      std::cout << "Bar " << (... << args) << '\n';
    }
};

我有一个 Storage class,其中包含 std::tuple 个可变数量的对象;我想将相同的构造函数参数传递给每个对象。

单参数大小写(有效):

类似于,我已经能够将单个构造函数参数传递给每个对象:

template<typename... Ts> 
struct Storage
{
    template<typename Arg>
    Storage(Arg arg) : storage((sizeof(Ts), arg)...) {} // passes 'arg' to each object

    std::tuple<Ts...> storage;
};

这有效,如图所示 (godbolt):

Storage<Foo, Bar> s("hello world");

输出:

Bar hello world
Foo hello world

扩展到多个构造函数参数(不起作用):

我需要将可变数量的参数传递给 Storage,但到目前为止我还不知道如何解压两个不同的参数包

初始尝试:

template<typename... Args>
Storage(Args... args) : storage((sizeof(Ts), args)...) {}
error: mismatched argument pack lengths while expanding ‘(sizeof (Ts), args)’
|     Storage(Args... args) : storage((sizeof(Ts), args)...) {}
|                                                          ^
template<typename... Args>
Storage(Args... args) : storage((sizeof(Ts), args...)...) {}
error: expected binary operator before ‘)’ token
|     Storage(Args... args) : storage((sizeof(Ts), args...)...) {}
|                                                         ^

问题:

是否可以通过传递相同可变数量的构造函数参数来构造可变元组?

template<typename... Ts> 
struct Storage
{
    template<typename... Args>
    Storage(Args... args) : storage(/* what goes here? */) {}

    std::tuple<Ts...> storage;
};

它将是:

template <typename... Args>
Storage(Args... args) : storage(Ts(args...)...) {}