【发布时间】:2014-03-24 08:04:11
【问题描述】:
我想制作一个可以用作模板参数的字符串文字。它使编译器陷入某种无限循环。有什么问题和解决方法?
template <char...> struct slit { };
template <typename ...A>
constexpr auto make_slit(char const* const s, A const ...args)
{
return *s ? make_slit(s + 1, *s, args...) : slit<args...>();
}
int main()
{
auto const tmp_(make_slit("slit"));
return 0;
}
强制性错误(clang++ -std=c++1y):
t.cpp:4:16: fatal error: recursive template instantiation exceeded maximum depth of 256
constexpr auto make_slit(char const* const s, A const ...args)
^
t.cpp:6:15: note: in instantiation of function template specialization 'make_slit<char, char, char, char, char, char, char, char, char, char, char, char, char, char, char,
char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char,
char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char,
char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char,
char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char,
char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char,
char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char,
char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char,
char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char,
char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char>' requested here
return *s ? make_slit(s + 1, *s, args...) : slit<args...>();
编辑:查看this 答案,生成编译时隙类型是可能的。
【问题讨论】:
-
C++ 似乎不支持这一点。检查this question。
-
当然支持这个,比如
slit<'a', 'b', 'c'>()就可以了,我只需要一个生成函数。 -
@user1095108 您的问题是,据我所知,
*s ?:不是编译时构造。因为没有什么能阻止你打电话给string s; cin >> s; make_slit(s.c_str()); -
在这方面应该存在编译器错误,而不是无限循环。注意函数是
constexpr。 -
@user1095108 有 gcc