如何绕过 const char* 到 int 的转换

Yau*_*dan 2 c++

我想写一个函数

template <class Arg>
tuple<int, double> calc(Arg arg);
Run Code Online (Sandbox Code Playgroud)

它返回:

[arg,0] if arg is int,
[0,arg] if arg is double 
and [0,0] if arg is nor int or double. 
Run Code Online (Sandbox Code Playgroud)

我实现这个函数比较arg的类型(Arg)、 i的类型(int) 和d (double)的类型,然后分别等于 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);
    }
Run Code Online (Sandbox Code Playgroud)

Ant*_*ier 5

如果不需要 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};
}
Run Code Online (Sandbox Code Playgroud)

如果您需要 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};
}
Run Code Online (Sandbox Code Playgroud)