我想编写一个函数
template <class Arg>
tuple<int, double> calc(Arg arg);
它返回:
[arg,0] if arg is int,
[0,arg] if arg is double
and [0,0] if arg is nor int or double.
我实现此功能,比较 arg (Arg)的类型, i (int)的类型和 d 的类型(双精度)和分别等于i = arg或d = arg 。 但是,如果我想将函数与无法转换为int / double的字符串或其他类型一起使用,则会发生转换错误(例如,很明显,因为我无法将char *等同于int)。 如何绕过将此const char *转换为int (或将另一种不可转换的类型转换为int)?也许还有该功能的另一种实现方式?
#define GETTYPE(x) typeid(x).name()
template <class Arg>
tuple<int,double> calc(Arg arg)
{
int i = 0;
double d = 0;
if (GETTYPE(arg) == GETTYPE(i))
{
i = arg;
}
else if (GETTYPE(arg) == GETTYPE(d))
{
d = arg;
}
return make_tuple(i, d);
}
答案 0 :(得分:4)
如果不需要C ++ 17代码,则可以使用重载
tuple<int, double> foo(int a) {
return {a, 0.0};
}
tuple<int, double> foo(double a) {
return {0, a};
}
template<typename T>
tuple<int, double> foo(T) {
return {0, 0.0};
}
如果您需要C ++ 17代码:
template<typename T>
tuple<int, double> foo([[maybe_unused]] T a) {
if constexpr (std::is_same_v<int, T>)
return {a, 0.0};
else if constexpr (std::is_same_v<double, T>)
return {0, a};
else
return {0, 0.0};
}
答案 1 :(得分:1)
最简单的解决方案是仅具有3个单独的重载:
tuple<int, double> calc(int arg)
{
return make_tuple(arg, 0.);
}
tuple<int, double> calc(double arg)
{
return make_tuple(0, arg);
}
template < typename T >
tuple<int, double> calc(T arg)
{
return make_tuple(0, 0.);
}
或者,您也可以使用模板专长:
template < typename T >
tuple<int, double> calc(T arg)
{
return make_tuple(0, 0.);
}
template <>
tuple<int, double> calc< int >(int arg)
{
return make_tuple(arg, 0.);
}
template <>
tuple<int, double> calc< double >(double arg)
{
return make_tuple(0, arg);
}