如何将const char *转换为int

时间:2018-09-16 15:59:05

标签: c++

我想编写一个函数

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);
    }

2 个答案:

答案 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);
}