在g ++ 4.9.0(20130421)上调用以下extract
函数对我不起作用。我得到的错误是s1
不是常量表达式。如果i
可以初始化为constexpr,那么j
和k
也应该。那是错的吗?
#include <tuple>
template <unsigned N1, unsigned N2>
constexpr bool strmatch(const char (&s1)[N1], const char (&s2)[N2], unsigned i = 0)
{
return (s1[i]==s2[i]) ?
(s1[i]=='\0') ?
true
: strmatch(s1, s2, i+1)
: false;
}
template<unsigned N>
constexpr int extract(const std::tuple<int, int> & t1, const char (&array)[N]) {
return std::get<strmatch(array, "m0")>(t1);
}
int main(void)
{
constexpr int i = strmatch("m0", "m0"); // OK
constexpr int j = extract(std::make_tuple(10, 20), "m0");
constexpr int k = extract(std::make_tuple(10, 20), "m1");
return 0;
}
答案 0 :(得分:1)
您的代码格式错误。问题是array
不是核心常量表达式,因此不能在调用std::get
的模板参数中使用:
template<unsigned N>
constexpr int extract(const std::tuple<int, int> & t1, const char (&array)[N]) {
return std::get<strmatch(array, "m0")>(t1);
}
请记住,constexpr
函数可以在运行时调用:此代码将在转换期间使用运行时参数的值(array
)(在评估对{{1的调用时) }})。