Dav*_*lot 6 c++ templates boost c++11
问题很简单:如何在C++类中打印模板参数的名称并在编译时将其分配给类变量?似乎必须在运行时或至少某些部分评估both typeinfo(typeid)和boost :: typeindex.这显然不允许编译器完全解决constexpr包含对此函数之一的调用.
template<typename T>
class X
{
public:
static const char * name = /* SOME C++ code transforming T in a string (either std::string or char */
};
Run Code Online (Sandbox Code Playgroud)
我错过了什么?是否只能在运行时生成名称?在那种情况下,我真的需要一个实例化的对象吗?这对我来说似乎不对,因为以下完美的工作没有任何实例:
#include <iostream>
#include <string>
#include <boost/type_index.hpp>
using namespace std;
template<class T>
class X
{
public:
static std::string name()
{
return boost::typeindex::type_id<T>().pretty_name();
}
};
struct foobar {};
int main()
{
cout << X<int>::name() << endl;
cout << X<foobar>::name()<< endl;
}
Run Code Online (Sandbox Code Playgroud)
因此name(),我不想将其作为类变量,而是将其作为类变量.
我认为,可以使用自定义类型特征。请看下一个例子:
#include <iostream>
#include <string>
using namespace std;
//Using stub type traits
template <class T>
struct TypeTraits;
//your TypeTraits for specific types...
template<>
struct TypeTraits<int>
{
constexpr static const char *name = "int";
};
template<class T>
class X
{
public:
constexpr static const char * name = TypeTraits<T>::name;
};
struct foobar {};
//TypeTraits for custom foobar
template<>
struct TypeTraits<foobar>
{
constexpr static const char *name = "foobar";
};
int main()
{
//Now you can use static member here
cout << X<int>::name << endl;
cout << X<foobar>::name<< endl;
}
Run Code Online (Sandbox Code Playgroud)
TypeTraits 还可以用于(和扩展)用于其他目的。