阅读C++ compile-time string hashing with Boost.MPL后,考虑到我遇到的问题,我想到了以下内容。
我有基类:
template<class Command>
class Base {
typedef Command CommandType;
}
它应该是Commands类的实用程序基类,因此它们不需要自己定义和声明某些成员,它们只是从它们引用的类型继承Base。所以他们可以像这样使用:
class CommandInstantiatorA : public Base<CommandA>
{
public:
static std::string GetID() { return "CommandInstantiatorA "; }
}
然而,还有另一种方法(GetID)我无法“模板化”,它通过应用程序返回一个唯一的ID。我希望能够散列传递给类Base的类型,因此其他类只需要指定类型。像这样:
template <class Base>
class Base {
typedef boost::hash_value(TO_STRING(Base)) ID; //should also be read as: typedef boost::hash_value("CommandA") ID;
...
}
是否有这样的宏(TO_STRING)会在最后一个示例中产生结果“CommandA”。 Boost.MPL中有什么可以做到的吗?
答案 0 :(得分:7)
不是在提升,但它只是C ++的一部分所以我希望它会这样做 - 也许你可以考虑使用RTTI - 例如像http://en.wikipedia.org/wiki/Typeid
int main () {
Person person;
Employee employee;
Person *ptr = &employee;
// The string returned by typeid::name is implementation-defined
std::cout << typeid(person).name() << std::endl; // Person (statically known at compile-time)
std::cout << typeid(employee).name() << std::endl; // Employee (statically known at compile-time)
std::cout << typeid(ptr).name() << std::endl; // Person * (statically known at compile-time)
std::cout << typeid(*ptr).name() << std::endl; // Employee (looked up dynamically at run-time
// because it is the dereference of a
// pointer to a polymorphic class)
}
答案 1 :(得分:1)
您可以使用预处理器字符串化 - 这可能无法解决所有问题,但您可以获取字符串:
#include <iostream>
using namespace std;
#define ToString(x) #x
struct C { static const string id; };
const string C::id = ToString(C_ID);
int main()
{
C c;
cout << c.id << endl;
}
打印:
C_ID
答案 2 :(得分:0)
预处理器(即宏)具有一个字符串化运算符,可以将任何标记包装在双引号中。这不能做你想要的,至少是写的,因为它会将文字标记“Base”字符串化,而不是替换的模板参数。