假设我有一个空的模板化结构 foo
template <typename T> struct foo {};
还有一个专门针对它的宏
#define SPECIALIZE(class_name) \
template <> \
struct foo<class_name> { \
static const std::string value; \
}; \
const std::string foo<class_name>::value = #class_name;
我想要一个方法来打印它作为模板参数的类的名称。通常,我会这样做:
template <typename T>
void print() {
std::cout << foo<T>::value << std::endl;
}
SPECIALIZE(std::vector<int>)
int main() {
print<std::vector<int>>();
return 0;
}
但是,我发现必须显式记录类非常烦人且容易出错,因为您必须确保宏被准确地调用一次。
我想做这样的事情:
template <typename T>
void print() {
if (notdefined(foo<T>::value)) {
SPECIALIZE(T)
}
std::cout << foo<T>::value << std::endl;
}
这当然是不可能的。
您知道我如何实现这一目标吗?
最佳答案
您想要做的是将模板参数设置为字符串。 不幸的是,这有两个问题
- 这被明确禁止“只是因为”
- 显然有一种在 C++11 中使用大量模板欺骗的解决方法
严重的问题实际上是2,因为这意味着C++可能永远不会在这个领域得到任何合理的东西(由于C++中的一些奇怪的原因,如果使用模板元编程存在一个极其复杂的半工作和逻辑上 splinter 的解决方案,那么就没有明智的解决方案将寻找)。
我的建议只是添加一个返回 const char * 的显式成员函数:
struct Protocol {
virtual const char *name() const = 0;
};
struct TCP : Protocol {
const char *name() const { return "TCP"; }
...
};
关于c++ - 模板特化 'on the fly',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43829511/