我想做这样的事情:
template<int N>
char* foo() {
// return a compile-time string containing N, equivalent to doing
// ostringstream ostr;
// ostr << N;
// return ostr.str().c_str();
}
Run Code Online (Sandbox Code Playgroud)
似乎boost MPL库可能允许这样但我无法弄清楚如何使用它来实现这一点.这可能吗?
说我有
constexpr const std::uint8_t major = 1;
constexpr const std::uint8_t minor = 10;
constexpr const std::uint8_t bugfix = 0;
Run Code Online (Sandbox Code Playgroud)
而且我要
constexpr const char* version_string(){ ... }
Run Code Online (Sandbox Code Playgroud)
要返回"1.10.0"本例中的等价物,我该怎么做?
我假设我需要这两个,在constexpr:
这个问题纯粹是学术性的,constexpr除了"有可能"之外,我认为实际上没有任何用处.我只是看不出这会如何发展.我愿意接受适用于GCC 4.9和Clang 3.4/3.5的C++ 1y解决方案.
我相信我在日本的一些博客上发现了几乎所有的东西:
我会看到我能用这些做些什么,也许当我对结果感到满意时,我自己回答这个自称有趣的问题.
在下面的示例中,我snprintf在模板函数内部使用来创建包含模板参数值的字符串N。我想知道是否有办法在编译时生成这个字符串。
template <unsigned N>
void test()
{
char str[8];
snprintf(str, 8, "{%d}", N);
}
Run Code Online (Sandbox Code Playgroud) 我遇到过这篇文章: 使用constexpr将数字转换为字符串文字
答案非常有趣:
namespace detail
{
template<unsigned... digits>
struct to_chars { static const char value[]; };
template<unsigned... digits>
const char to_chars<digits...>::value[] = {('0' + digits)..., 0};
template<unsigned rem, unsigned... digits>
struct explode : explode<rem / 10, rem % 10, digits...> {};
template<unsigned... digits>
struct explode<0, digits...> : to_chars<digits...> {};
}
template<unsigned num>
struct num_to_string : detail::explode<num> {};
Run Code Online (Sandbox Code Playgroud)
我的问题是:
"struct explode:explode"声明爆炸继承自爆炸; 怎么样"struct explode <0,digits ...>:to_chars"?
'0'作为第一个模板参数的功能是什么?
谢谢!