我想写一个函数
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)
如果不需要 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)
| 归档时间: |
|
| 查看次数: |
395 次 |
| 最近记录: |