我有一个函数,它接受一个具有默认值的参数。现在我还希望它采用可变数量的参数并将它们转发给其他函数。具有默认值的函数参数必须在最后,所以……我可以将该参数放在可变参数包之后,编译器会在调用函数时检测我是否提供它?
(假设包不包含最后一个参数的类型。如有必要,我们可以假设,因为该类型通常不应该为用户所知,否则无论如何它都被认为是我的界面的错误使用.. ..)
template <class... Args>
void func (Args&&... args, SomeSpecialType num = fromNum(5))
{
}
原文由 cfa45ca55111016ee9269f0a52e771 发布,翻译遵循 CC BY-SA 4.0 许可协议
不,包必须放在最后。
但你可以伪造它。您可以检测到包装中的最后一种类型是什么。如果是
SomeSpecialType
,你可以运行你的函数。如果不是SomeSpecialType
,您可以递归调用自己,并转发您的参数并附加fromNum(5)
。如果您想花哨的话,可以使用 SFINAE 技术在编译时(即不同的重载)完成此检查。但这可能不值得麻烦,考虑到“运行时”检查将在给定的过载情况下保持不变,因此几乎肯定会被优化,并且不应轻易使用 SFINAE。
这不会给你你想要的签名,但它会给你你想要的行为。您必须在评论中解释预期的签名。
像这样,在你删除错别字等之后:
或类似的东西。