出于某种原因(ehm CUDA)我在我的C ++代码中使用printf()
。我希望能够模拟其中一些用途 - 但为了实现这一点,我需要获取各种类型的printf类型说明符。假设我只需要这个用于实际具有相关说明符的类型;并且我并不真正关心科学与十进制表示法以及其他此类细节。
除了拥有查找表之外,还有一种惯用的方法吗?
注意:我希望这一切都发生在编译时,而不是运行时。尽管printf()
本身只在运行时解析它。
答案 0 :(得分:3)
我会用这样的东西:
template <typename T> struct PrintfSpecifier;
#define TYPE_SPEC(type, spec) \
template <> struct PrintfSpecifier<type>{static constexpr const char *value = spec;}
TYPE_SPEC(int , "%d");
TYPE_SPEC(unsigned int , "%u");
// More types here...
#undef TYPE_SPEC
要获取字符串,您可以使用PrintfSpecifier<int>::value
。
如果你能够使用C ++ 14并且你喜欢花哨的功能,那么有一个更干净的选择:
template <typename T> constexpr const char *printf_specifier = "";
#define TYPE_SPEC(type, spec) \
template <> constexpr const char *printf_specifier<type> = spec;
TYPE_SPEC(int , "%d");
TYPE_SPEC(unsigned int , "%u");
// More types here...
#undef TYPE_SPEC