结果我有constexpr函数计算占位符https://godbolt.org/g/JcxSiu的数量,编译时间检查的sizeof ...(参数)与从constexpr功能
e.g: “Hello %1
” 返回1
和 “Hello %1, time is %2
” 返回2
。
然后,我想作出一个函数,如果参数的数量不等于占位符的数量,它不会编译。
template <typename... Args>
inline std::string make(const char* text, Args&&... args) {
constexpr static unsigned count = sizeof...(args);
// TODO how to compile time check if count == count_placeholders(text)
// constexpr static auto np = count_placeholders(text);
//static_assert(count == np;, "Wrong number of arguments in make");
return std::to_string(count);
};
使 make("Hello %1", "World");
编译和
make("Hello %1 %2", "World");
或make("Hello %1", "World", "John");
没有。
我认为这是可以做到的,我只是不知道如何。也许一些模板magick :)
编辑
我几乎得到了我想要的东西。 https://godbolt.org/g/Y3q2f8
现在以调试模式中止。编译时错误是可能的?
这是**没有答案**,因为它使用GNU扩展buf,如果它不打扰你可以使用[字符串文字模板](https://wandbox.org/permlink/bSLW5DNEX4gNuDyw)。这将适用于gcc和clang,但可能不适用于任何其他编译器...... –
这可能不是一个可以接受的答案,但这里是使用Boost.Metaparse宏的解决方案。 [实施例](https://godbolt.org/g/tZYzyH)。 – llonesmiz