C++模板T,检测Type是字符串的形式

Chr*_*ris 2 c++ templates types std

我在C++中有一个模板函数,它基本上将值写入XML文件,出于验证目的,我希望写出变量类型及其值.我目前正在使用typeid(T).name()这伟大工程int,double等等,但我想对于一个特例char阵列和std::string,使其始终写出"串"或东西比更有意义:

class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
Run Code Online (Sandbox Code Playgroud)

要么

char const  [2]
Run Code Online (Sandbox Code Playgroud)

关于如何以优雅的方式做到这一点的任何想法?

我的代码(减少)看起来像这样(不是函数只是模板)

  template <typename T> bool SetValue(const std::string &sectionName, const std::string &valueName, const T &value)
  {
      myXMl->AddAttribute(TYPE_DEF,typeid(T).name());
      return true;
  }
Run Code Online (Sandbox Code Playgroud)

Bjö*_*lex 10

您可以使用traits类:

template<class T>
class type_name {
public:
    static std::string get() { return typeid(T).name(); }
};
Run Code Online (Sandbox Code Playgroud)

此模板实现默认情况.现在,您可以将其专门用于应具有特殊名称的类型:

template<>
class type_name<std::string> {
public:
    static std::string get() { return "string"; }
};

template<>
class type_name<const char *> {
public:
    static std::string get() { return "string"; }
};

template<int N>
class type_name<const char[N]> {
public:
    static std::string get() { return "string"; }
};
Run Code Online (Sandbox Code Playgroud)

您的代码将如下所示:

template <typename T> bool SetValue(const std::string &sectionName, 
                                    const std::string &valueName, const T &value)
  {
      myXMl->AddAttribute(TYPE_DEF, type_name<T>::get());
      return true;
  }
Run Code Online (Sandbox Code Playgroud)