0

前回の記事で、関数パラメーターをコンパイル時のコンストラクトの引数として使用できないことを知りました。これは、 function へのパラメーターは実行時に期待されるが、テンプレート引数はコンパイル時に処理されるためです。

残念ながらconstexpron パラメータを使用できないため、テンプレート引数を使用することにしました。それは問題なく動作しますが、ルックスに関しては、それが最良の選択肢であるとは言えません:

#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?
}

これを回避する方法はありますか?明示的な演算子構文を回避しながら、どのように関数に定数式を与えることができますか? マクロで可能ですか?

4

1 に答える 1

2

コンパイル時の定数をラップするクラス テンプレートを追加できます (またはこれを使用http://www.boost.org/doc/libs/1_53_0/libs/mpl/doc/refmanual/int.html )、パラメーターを作成します演算子 [] をテンプレート化し、ラップされた定数の値を演算子に渡します。演算子の宣言は次のように変更されます。

template <typename T>
auto operator[](T) -> ...

ブースト MPL を使用する場合は、オペレーター内で N を T::value に置き換えます。

演算子の使用は次のように変更されます。

int i = list[int_<0>()];
于 2013-04-30T00:36:26.843 に答える