1

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

出于说明目的,我有 2 个可以采用任意数量的构造函数参数的类:

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包含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;
};
4

1 回答 1

2

这将是:

template <typename... Args>
Storage(Args... args) : storage(Ts(args...)...) {}
于 2021-01-06T15:18:25.383 回答