Nat*_*mal 0 c++ variadic-templates stdtuple c++17
我有一个构建器类,我想将参数存储为引用,以便在后续构建中使用。
我想将可变数量的参数传递给我的类,使用类模板参数推导来推断模板参数,并将这些传递的参数作为引用存储在std :: tuple中。
从参数包转换为引用的std :: tuple的最简单方法是什么?
我发现std :: forward_as_tuple的功能与我想要的类似,但是我不想要转发引用,而且它在成员元组的初始化期间提供了语法错误。
template <typename... Ts>
struct Builder
{
using ArgsT = decltype(std::forward_as_tuple(Ts{}...));
ArgsT args_;
Builder(Ts&... ts) : args_(ts...) {}
};
int main()
{
struct Foo
{
int a;
double b;
};
Foo foo{};
Builder fooBuilder{foo.a, foo.b};
}
Run Code Online (Sandbox Code Playgroud)
语法错误是:
错误:没有匹配的调用函数
std::tuple<int&&, double&&>::tuple(int&, double&)
如果您只想参考,请直接使用它们:
template <typename... Ts>
struct Builder
{
using ArgsT = std::tuple<Ts&...>;
ArgsT args_;
Builder(Ts&... ts) : args_(ts...) {}
};
int main()
{
struct Foo
{
int a;
double b;
};
Foo foo{};
Builder fooBuilder{foo.a, foo.b};
}
Run Code Online (Sandbox Code Playgroud)
对于您的代码:
decltype(std::forward_as_tuple(Ts{}...))解决std::tuple<Ts&&...>。
Ts{}创建一个临时文件(并要求您的类型是默认可构造的)。
而且您无法绑定int&到int&&。
您可以在中使用decltype(std::forward_as_tuple(std::declval<Ts&>()...))哪个解析std::tuple<Ts&...>,但稍后会提供更简单的解决方案;-)。
| 归档时间: |
|
| 查看次数: |
85 次 |
| 最近记录: |