10

テンプレートでは、テンプレートパラメータを実際の非テンプレートタイプにドリルダウンしたいと思います。それで:

template <typename T>
struct MyTemplate
{
    // sadly there's no extract_Base
    typedef typename extract_base<T>::MyType WorkType;
};
struct X {};
template <typename T> struct Templ {};
//MyTemplate<Templ<X>>::WorkType is X;
//MyTemplate<X>::WorkType is X;

私が見る唯一の解決策は、std :: vector <X> :: value_typeがXのように実際の基本型を定義することです。しかし、各宛先テンプレート内に補助型を定義せずにこれを行う方法があるかどうか興味があります。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2965.htmlのようなものを見ましたが、これはドラフトですか?よくわかりません。

はい、多重継承があることは知っていますが、単純な場合でもこれは素晴らしいことです。

更新:Nawazソリューションは私にとって非常にうまく機能し、特定のケースに拡張するのは簡単です。

template<template<typename, typename> class X, typename T1, typename T2>
struct extract_base <X<T1, T2>>   //specialization
{
    typedef T1 base;
};

is_base_ofやその他のフィルターをT1/T2などに適用することもできます。したがって、X <T、U>では機能します-少なくともg++4.6.7では機能します。

4

1 に答える 1

12

まず、抽出したいタイプを説明するのに適切な用語のように思われるので、のvalue_type代わりにそれを呼び出しましょう。basevalue_type

あなたはこれを使うことができます:

template<typename T>
struct extract_value_type //lets call it extract_value_type
{
    typedef T value_type;
};

template<template<typename> class X, typename T>
struct extract_value_type<X<T>>   //specialization
{
    typedef T value_type;
};

のテンプレート引数がまたはのいずれかextract_value_typeの形式である限り、機能するはずです。ただし、では機能しません。ただし、可変個引数テンプレートを使用してC++11で実装するのは簡単です。TX<T>X<T,U>

次のように使用します。

template <typename T>
struct MyTemplate
{
    typedef typename extract_value_type<T>::value_type value_type;
};

オンラインデモ: http: //ideone.com/mbyvj


現在、C ++ 11では、可​​変個引数テンプレートを使用して、、などの複数extract_value_typeのテンプレート引数をとるクラステンプレートを操作できます。std::vectorstd::setstd::list

template<template<typename, typename ...> class X, typename T, typename ...Args>
struct extract_value_type<X<T, Args...>>   //specialization
{
    typedef T value_type;
};

デモ: http: //ideone.com/SDEgq

于 2012-06-15T19:11:06.013 に答える