1

配列のようにアクセスできる Tuple クラスを構築しようとしています。おそらく (void *) に変換することもできますが、型の安全性を確保しようとしているため、テンプレートの目的が無効になります。

VS2010 pro を使用してコンパイルしています。私の現在の機能していないソリューションでは、次のエラーが発生します。

エラー: 'Item &MyList::operator ': 'N' のテンプレート引数を推測できませんでした。

#include <tuple>
#include <stdio.h>

template <int size, typename Ty0, 
typename Ty1=std::tr1::_Nil, typename Ty2=std::tr1::_Nil, typename Ty3=std::tr1::_Nil,
typename Ty4=std::tr1::_Nil, typename Ty5=std::tr1::_Nil, typename Ty6=std::tr1::_Nil, 
typename Ty7=std::tr1::_Nil, typename Ty8=std::tr1::_Nil, typename Ty9=std::tr1::_Nil>
struct MyList {
    std::tuple<Ty0, Ty1, Ty2, Ty3, Ty4, Ty5, Ty6, Ty7, Ty8, Ty9> items;

    template <int N, typename Ty>
    Ty &operator[](int N) {
        auto &var = std::get<N>(items);
        return var;
    }
};

void main() {
    MyList<2, int, double> list;
    auto var = list[0];
}

潜在的な解決策: (編集)

  1. 同種データの可変個引数テンプレート
  2. constexpr C++11 の使用
4

1 に答える 1

3

タプルにインデックスを付けたいものによって異なります。ランタイム整数を使用している場合、明らかにタイプ セーフを達成できません。コンパイラがどの型を返すかを知る方法はありません (タプルが同種の場合は、上記を参照してください)。

一方、添え字の構文の直後にいる場合は、適切なタイプのインデックス オブジェクトを使用してこれを行うことができますstd::placeholders

template<typename T>
typename std::tuple_element<std::is_placeholder<T>::value,
  std::tuple<Ty0, Ty1, Ty2, Ty3, Ty4, Ty5, Ty6, Ty7, Ty8, Ty9>>::type &
operator[](T) { return std::get<std::is_placeholder<T>::value>(items); }

使用法:

using namespace std::placeholders;
auto var = list[_1];
于 2013-04-11T16:34:50.510 に答える