gpt4 book ai didi

具有默认值的 C++ 可变参数模板函数参数

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

我有一个函数,它接受一个带有默认值的参数。现在我还希望它采用可变数量的参数并将它们转发给其他函数。默认值的函数参数必须放在最后,所以...我可以把那个参数放在可变参数包之后,编译器会在调用函数时检测我是否提供它?

(假设pack不包含最后一个参数的类型。如有必要,我们可以假设,因为该类型通常不应该被用户知道,否则被认为是我的接口(interface)的错误使用无论如何....)

template <class... Args>
void func (Args&&... args, SomeSpecialType num = fromNum(5))
{
}

最佳答案

不,包必须放在最后。

但你可以伪造它。您可以检测到包装中的最后一种类型是什么。如果是SomeSpecialType,你可以运行你的func。如果不是 SomeSpecialType,您可以递归调用自己,并转发参数并附加 fromNum(5)

如果您想花点心思,可以使用 SFINAE 技术在编译时(即不同的重载)完成此检查。但这可能不值得麻烦,考虑到“运行时”检查将在给定的过载情况下保持不变,因此几乎肯定会被优化,并且不应轻易使用 SFINAE。

这不会给你你想要的签名,但它会给你你想要的行为。您必须在评论中解释预期的签名。

这样的东西,在你删除错别字之类的东西之后:

// extract the last type in a pack.  The last type in a pack with no elements is
// not a type:
template<typename... Ts>
struct last_type {};
template<typename T0>
struct last_type<T0> {
typedef T0 type;
};
template<typename T0, typename T1, typename... Ts>
struct last_type<T0, T1, Ts...>:last_type<T1, Ts...> {};

// using aliases, because typename spam sucks:
template<typename Ts...>
using LastType = typename last_type<Ts...>::type;
template<bool b, typename T=void>
using EnableIf = typename std::enable_if<b, T>::type;
template<typename T>
using Decay = typename std::decay<T>::type;

// the case where the last argument is SomeSpecialType:
template<
typename... Args,
typename=EnableIf<
std::is_same<
Decay<LastType<Args...>>,
SomeSpecialType
>::value
>
void func( Args&&... args ) {
// code
}

// the case where there is no SomeSpecialType last:
template<
typename... Args,
typename=EnableIf<
!std::is_same<
typename std::decay<LastType<Args...>>::type,
SomeSpecialType
>::value
>
void func( Args&&... args ) {
func( std::forward<Args>(args)..., std::move(static_cast<SomeSpecialType>(fromNum(5))) );
}

// the 0-arg case, because both of the above require that there be an actual
// last type:
void func() {
func( std::move(static_cast<SomeSpecialType>(fromNum(5))) );
}

或类似的东西。

关于具有默认值的 C++ 可变参数模板函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14805192/

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