gpt4 book ai didi

c++ - 可变参数模板参数顺序,它们必须始终是最正确的参数吗?

转载 作者:IT老高 更新时间:2023-10-28 22:25:04 27 4
gpt4 key购买 nike

我想修改一个现有的类构造函数:

template< typename T, typename... Ts >
MyClass( std::vector<T>& head, Ts& ...tail );

这样可以指定处理标志:

template< typename T, typename... Ts >
MyClass( MyEnum myEnum, std::vector<T>& head, Ts& ...tail );

这很好用,但是我想知道是否有办法将它指定为最右边的参数,并且可能使用默认值。我从来没有见过这样声明的可变参数模板,但话又说回来,我找不到任何明确说明它们不可能的东西。我试过了:

template< typename T, typename... Ts >
MyClass( std::vector<T>& head, Ts& ...tail, MyEnum myEnum );

...

MyClass myClass( dataA, dataB, dataC, MyEnum::VALUE );

但是编译器不喜欢它,我假设这是由于可变参数模板的解析方式以及它们必须是最右边的参数?

这在 C++11 中可行吗?

最佳答案

在中间有一个函数参数包并不违法,但是当你尝试使用构造函数来做这件事时会遇到一个巨大的障碍:一个函数参数包不会出现在 参数的末尾-declaration-list 是非推导上下文(§14.8.2.5 [temp.deduct.type]/p5,最后一个要点),必须使用模板参数推导调用构造函数模板 - 你不能显式指定它们的模板参数。

即中间要有函数参数包,调用函数时必须显式指定模板参数:

template< typename T, typename... Ts >
void test( const std::vector<T>& head, const Ts& ...tail, MyEnum myEnum ) { }

test<double, int>(std::vector<double>(), 10, MyEnum()); // legal

但这不会编译:

test(std::vector<double>(), 10, MyEnum()); // No deduction performed for the parameter pack

但是,当您调用构造函数模板时,该语言无法显式指定模板参数(第 14.8.1 节 [temp.arg.explicit]/p7):

[ Note: Because the explicit template argument list follows the function template name, and because conversion member function templates and constructor member function templates are called without using a function name, there is no way to provide an explicit template argument list for these function templates. —end note ]

因此,对于构造函数,您必须依赖模板参数推导 - 如果您的函数参数包不在末尾,这将不起作用。

关于c++ - 可变参数模板参数顺序,它们必须始终是最正确的参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25320366/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com