我尝试使用变量模板的方式与使用其他模板的方式相同,例如:我们已经知道如何使用Fibonacci number元编程来计算power of a number或template objects wrapping a static value or a enum value。
所以,我做的第一件事是尝试专门化模板变量,它按预期工作:
template <std::size_t VALUE> std::size_t value = VALUE;
template <> std::size_t value<666u> = 1u;
std::cout << value<0u> << '\n'; // "0" as expected
std::cout << value<1u> << '\n'; // "1" as expected
std::cout << value<2u> << '\n'; // "2" as expected
std::cout << value<666u> << '\n'; // "1" as expected!!
知道可变模板专业化是可能的我已经尝试做变量模板Fibonacci数字:
template <std::size_t ITERATION>
std::size_t fibonacci = fibonacci<ITERATION - 1u> + fibonacci<ITERATION - 2u>;
template <> std::size_t fibonacci<1u> = 1u;
template <> std::size_t fibonacci<0u> = 0u;
int main()
{
std::cout << fibonacci<5> << '\n'; // "8" expected;
return 0;
}
我从Wandbox得到的错误如下:
error: expected primary-expression before ';' token
template <std::size_t ITERATION> std::size_t fibonacci = fibonacci<ITERATION - 1u> + fibonacci<ITERATION - 2u>;
^
我不知道我做错了什么也不明白错误。我猜这个错误可能与我已经使用它时变量模板尚未定义的事实有关,所以我想知道是否有可能用变量模板实现我的目标。
任何提示?
非常感谢。
答案 0 :(得分:2)
我的猜测是编译器还没有正确实现变量模板。例如,clang 3.7.0会编译您的代码,但(对于一个小错误修复:fibonacci<0u> = 1u
)会为0
输出8
而不是fibonacci<5>
。
但是,如果我们这样做
std::cout << fibonacci<0> << '\n'; // "1" expected;
std::cout << fibonacci<1> << '\n'; // "1" expected;
std::cout << fibonacci<2> << '\n'; // "2" expected;
std::cout << fibonacci<3> << '\n'; // "3" expected;
std::cout << fibonacci<4> << '\n'; // "5" expected;
std::cout << fibonacci<5> << '\n'; // "8" expected;
然后我们得到了预期的结果。怪异!
更新由于功能模板比变量模板更成熟,因此以下是一种解决方法:
template <std::size_t ITERATION>
constexpr std::size_t get_fibonacci()
{
return get_fibonacci<ITERATION - 1u>() + get_fibonacci<ITERATION - 2u>();
}
template <>
constexpr std::size_t get_fibonacci<0u>() {
return 1u;
}
template <>
constexpr std::size_t get_fibonacci<1u>() {
return 1u;
}
template <std::size_t ITERATION>
std::size_t fibonacci = get_fibonacci<ITERATION>();