6

クラスA、B、Cのセットがあり、それらのインスタンスにジェネリックコードからタイプfeでアクセスしたい

template<typename T>
newObject()
{
    return m_storage->getNew();
}

ここで、m_storage は A または B または C のインスタンスであり、T に依存します。

だから私はstd::tupleを思いつきましたが、タプルから型で要素を取得できないため、問題があります。

std::tuple<A,B,C> m_tpl;
template<typename T>
newObject()
{
    return m_tpl.get<T>().getNew();
}

それを行う方法はありますか?これは可能ですか?

ありがとう。

PS: 型ごとに newObject の特殊化を書きたくありません。:-)

4

3 に答える 3

18

これは、タイプごとにタプルから値を取得することに関する C++14 のドラフトです。

しかし、C++14 が登場する前に、以下のように書くことができます:

namespace detail
{

template <class T, std::size_t N, class... Args>
struct get_number_of_element_from_tuple_by_type_impl
{
    static constexpr auto value = N;
};

template <class T, std::size_t N, class... Args>
struct get_number_of_element_from_tuple_by_type_impl<T, N, T, Args...>
{
    static constexpr auto value = N;
};

template <class T, std::size_t N, class U, class... Args>
struct get_number_of_element_from_tuple_by_type_impl<T, N, U, Args...>
{
    static constexpr auto value = get_number_of_element_from_tuple_by_type_impl<T, N + 1, Args...>::value;
};

} // namespace detail

template <class T, class... Args>
T get_element_by_type(const std::tuple<Args...>& t)
{
    return std::get<detail::get_number_of_element_from_tuple_by_type_impl<T, 0, Args...>::value>(t);
}

int main()
{
    int a = 42;

    auto t = std::make_tuple(3.14, "Hey!", std::ref(a));

    get_element_by_type<int&>(t) = 43;

    std::cout << a << std::endl;

    // get_element_by_type<char>(t); // tuple_element index out of range

    return 0;
}
于 2013-05-23T07:25:12.910 に答える
-1

テンプレートが気に入らない場合は、 constexpr 関数を使用して型の位置を計算することもできます。

  constexpr int count_first_falses() { return 0; }

  template <typename... B>
  constexpr int count_first_falses(bool b1, B... b)
  {
    if (b1) return 0;
    else return 1 + count_first_falses(b...);
  }

  template <typename E, typename... T>
  decltype(auto) tuple_get_by_type(const std::tuple<T...>& tuple)    
  {
    return std::get<count_first_falses((std::is_same<T, E>::value)...)>(tuple);
  }
于 2016-03-09T11:14:42.857 に答える