Boost中的DEFINE_TYPE_NAME如何运作?

时间:2014-12-01 16:29:11

标签: c++ boost

我以为我知道C ++。错。

template<typename T>
struct string_type_name;
#define DEFINE_TYPE_NAME(Type) \
template<> struct string_type_name<Type> \
{ \
static char const * _() \
{ \
return #Type; \
} \
}
DEFINE_TYPE_NAME(float);
DEFINE_TYPE_NAME(double);
DEFINE_TYPE_NAME(long double);

来自Boost.Math的代码。这个宏做了什么以及为什么需要它? template<>意味着什么,没有争论?我们为什么要声明这个函数static char const * _()

1 个答案:

答案 0 :(得分:2)

我们只是展开宏:

template<typename T>
struct string_type_name;

template<> struct string_type_name<float>
{
  static char const * _()
  {
    return "float";
  }
}

template<> struct string_type_name<double>
{
  static char const * _()
  {
    return "double";
  }
}

template<> struct string_type_name<long double>
{
  static char const * _()
  {
    return "long double";
  }
}

每个以template<>开头的结构都是上面声明的string_type_name类的特化。您会注意到非专用模板实际上没有定义 - 这是为了防止您使用不是专门的类型之一来实例化它。

_函数(不是一个非常好的名称)返回一个char const*,它是表示它专门用于的类型的字符串文字。也就是说,它只是从类型到字符串的映射:string_type_name<float>::_()将返回"float"。您可以在下面看到他们如何使用它:

BOOST_TEST_MESSAGE("Testing multiplication for "
    << string_type_name<T>::_() << ".");