我可以在c ++中使用无序函数参数吗?

use*_*477 -1 c++

我想要一个组合功能,它可以按任意顺序获取多个参数.例如:

int combine(int a, float b, char c)
{
    return a+b+c;
}
Run Code Online (Sandbox Code Playgroud)

这只是我想要做一个例子,但我希望能够调用此函数的参数的任何命令:combine(1,2.5,'c')或combine('c', 1 2.5)或combine(2.5,1,'c') 因为每一种情况下创建一个功能是乏味尤其是当你有很多的争论,你想那些以任何顺序.这可能吗?

jua*_*nza 6

您可以使用功能模板:

template <typename T1, typename T2, typename T3>
int combine(T1 a, T2 b, T3 c)
{
    return a+b+c;
}
Run Code Online (Sandbox Code Playgroud)

请注意,这将a是b,和c将成为加法表达式a+b+c有效的任何类型.


Die*_*ühl 5

你可以制作combine()一个功能模板

template <typename T0, typename T1, typename T2>
int combine(T0 a0, T1 a1, T2 a2) {
    return a0 + a1 + a2;
}
Run Code Online (Sandbox Code Playgroud)

如果要限制可以传递的类型,可以使用SFINAE添加约束.将参数限制为类型char,int和float,特别是如果应该允许标准转换,并不完全是微不足道的.我认为它看起来像这样:

#include <type_traits>

template <typename T>
struct is_allowed
    : std::integral_constant<bool,
          std::is_convertible<T, char>::value
          || std::is_convertible<T, int>::value
          || std::is_convertible<T, float>::value> {
};
template <typename T0, typename T1, typename T2>
typename std::enable_if<
    is_allowed<T0>::value && is_allowed<T1>::value && is_allowed<T2>::value,
int>::type combine(T0 a0, T1 a1, T2 a2) {
    return a0 + a1 + a2;
}
Run Code Online (Sandbox Code Playgroud)

如果您确实想要保留小数部分(如果存在),您可能需要查看std::common_type<T0, T1, T2>::type返回类型.