如何避免为运算符编写显式模板参数获取编译时的值?

时间:2013-04-30 00:17:28

标签: c++ templates c++11 variadic-templates

根据我之前的帖子,我了解到我不能使用函数参数作为编译时构造的参数。这是因为函数的参数在运行时是预期的,但模板参数在编译时处理。

由于遗憾的是我不能在参数上使用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?
}

有什么方法可以避免这种情况吗?如何在避免显式运算符语法的同时为函数提供常量表达式?是否可以使用宏?

1 个答案:

答案 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>()];