获取类型的打印说明符的习惯方法?

时间:2016-07-10 20:48:10

标签: c++ printf format-specifiers

出于某种原因(ehm CUDA)我在我的C ++代码中使用printf()。我希望能够模拟其中一些用途 - 但为了实现这一点,我需要获取各种类型的printf类型说明符。假设我只需要这个用于实际具有相关说明符的类型;并且我并不真正关心科学与十进制表示法以及其他此类细节。

除了拥有查找表之外,还有一种惯用的方法吗?

注意:我希望这一切都发生在编译时,而不是运行时。尽管printf()本身只在运行时解析它。

1 个答案:

答案 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