前回の記事で、関数パラメーターをコンパイル時のコンストラクトの引数として使用できないことを知りました。これは、 function へのパラメーターは実行時に期待されるが、テンプレート引数はコンパイル時に処理されるためです。
残念ながらconstexpr
on パラメータを使用できないため、テンプレート引数を使用することにしました。それは問題なく動作しますが、ルックスに関しては、それが最良の選択肢であるとは言えません:
#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?
}
これを回避する方法はありますか?明示的な演算子構文を回避しながら、どのように関数に定数式を与えることができますか? マクロで可能ですか?