根据我之前的帖子,我了解到我不能使用函数参数作为编译时构造的参数。这是因为函数的参数在运行时是预期的,但模板参数在编译时处理。
由于遗憾的是我不能在参数上使用constexpr
,所以我决定使用模板参数。它工作正常,但就外观而言,我不会说它是最好的选择:
#include <tuple>
template <class... Args>
struct type_list
{
std::tuple<Args...> var;
type_list(Args&&... args) : var(std::forward<Args>(args)...) {}
template <std::size_t N>
auto operator[](std::size_t)
-> typename std::tuple_element<N, std::tuple<Args...>>::type&&
{
return std::move(std::get<N>(var));
}
};
int main()
{
type_list<int, int, bool> list(2, 4, true);
int i = list.operator[]<0>(0); // How can I avoid this?
}
有什么方法可以避免这种情况吗?如何在避免显式运算符语法的同时为函数提供常量表达式?是否可以使用宏?
答案 0 :(得分:2)
您可以添加包装编译时常量(或使用此http://www.boost.org/doc/libs/1_53_0/libs/mpl/doc/refmanual/int.html)的类模板,使操作符[]的参数模板化,并将包装常量的值传递给运算符。您的运营商声明更改为:
template <typename T>
auto operator[](T) -> ...
如果使用boost MPL
,则在运算符内部用T ::值替换N.使用操作员更改为:
int i = list[int_<0>()];