C++ 如何确保模板类型是数字类型?

C++ 如何确保模板类型是数字类型?,c++,templates,C++,Templates,如何确保传递给模板函数的类型是数字类型 以下是我的功能: template <typename T> T toStdNumber() { type_info t_info = typeid(T); /* ... Converting my class to T if it's numeric type ... */ } 模板 T toStdNumber() { type_info t_info=typeid(t); /*…如果我的类是数字类型,则将其转换为T*/ } 我必

如何确保传递给模板函数的类型是数字类型

以下是我的功能:

template <typename T>
T toStdNumber()
{
  type_info t_info = typeid(T);
  /* ... Converting my class to T if it's numeric type ... */
}
模板
T toStdNumber()
{
type_info t_info=typeid(t);
/*…如果我的类是数字类型,则将其转换为T*/
}

我必须在2003标准中这样做,因此
不是一个解决方案。

静态断言应该可以做到:

#include <type_traits>

template <typename T>
T toStdNumber()
{
    static_assert(std::is_arithmetic<T>::value, "Not an arithmetic type");
    // ...
}
#包括
模板
T toStdNumber()
{
静态_断言(std::is_算术::value,“不是算术类型”);
// ...
}

因为我还没有找到C++03的简明解决方案,所以我决定使用这种令人毛骨悚然的结构

if (
    typeid(T) != typeid(short int) &&
    typeid(T) != typeid(int) &&
    typeid(T) != typeid(long int) &&
    typeid(T) != typeid(long long int) &&
    typeid(T) != typeid(unsigned short int) &&
    typeid(T) != typeid(unsigned int) &&
    typeid(T) != typeid(unsigned long int) &&
    typeid(T) != typeid(unsigned long long int)
  )
  throw bad_typeid();

谢谢!你救了我一天!)@我很高兴它有帮助:-)对不起,我没有说我必须使用2003标准件。我的错。这不是C++11类型的特征吗?当然,它来自TR1,所以它已经存在了一段时间了。@MSalters:自己写这个特性也很简单;静态断言是您在这里想要的真正的C++11特性。否则,您需要一些更笨拙的解决方法(尽管这也是可能的)。如果
T
不是算术,您想做什么?因为最简单的方法是继续并假设
T
是算术.exit函数(抛出异常、返回increct值等);有可能在编译时检测到这一点并导致编译错误。C++03没有
long-long-int
TR1是在C++11之前发布的,它的实现在C++03上运行。您的编译器可能有TR1,或者您也可以在boost中寻找编译时替代方法。