7

次のメンバー関数を特化したい:

class foo {
    template<typename T>
    T get() const;
};

barテンプレートに依存する他のクラスにも。

たとえば、次のようないくつかのテンプレート パラメーターを使用したいbarと考えています。std::pair

template<>
std::pair<T1,T2> foo::get() const
{
    T1 x=...;
    T2 y=...;
    return std::pair<T1,T2>(x,y);
}

T1 と T2 もテンプレートです。これはどのように行うことができますか?私の知る限り、それは可能なはずです。

だから今私は呼び出すことができます:

some_foo.get<std::pair<int,double> >();

完全/最終的な答え:

template<typename T> struct traits;
class foo {
    template<typename T>
    T get() const
    {
       return traits<T>::get(*this); 
    }
};

template<typename T>
struct traits {
    static T get(foo &f)
    {
        return f.get<T>();
    }
};

template<typename T1,typename T2>
struct traits<std::pair<T1,T2> > {
        static std::pair<T1,T2> get(foo &f)
        {
                T1 x=...;
                T2 y=...;
                return std::make_pair(x,y);
        }
};
4

2 に答える 2

8

関数テンプレートを部分的に特殊化することはできません。申し訳ありませんが、それがルールです。次のようなことができます:

class foo {
   ...
};


template<typename T>
struct getter {
  static T get(const foo& some_foo);
};

template<typename T1, typename T2>
struct getter< std::pair<T1, T2> > {
static std::pair<T1, T2> get(const foo& some_foo) {
    T1 t1 = ...;
    T2 t2 = ...;
    return std::make_pair(t1, t2);
};

そしてそれを次のように呼び出します

getter<std::pair<int, double> >::get(some_foo);

けれど。メンバー関数が本当に必要なfriend場合は、船や可視性をいじる必要があるかもしれません。get

sbiの提案について詳しく説明するには:

class foo {
   ...
   template<typename T>
   T get() const;
};

template<typename T>
T foo::get() const
{
  return getter<T>::get(*this);
  /*            ^-- specialization happens here */
}

そして今、あなたは言うことができるようになりました

std::pair<int,double> p = some_foo.get<std::pair<int, double> >();
于 2009-08-23T13:05:21.110 に答える
1

次のように、ペアのメンバー関数をオーバーロードする必要があります

template <T, V> std::pair<T, V> foo::get()

一般的なケースでは、さまざまなオーバーロードの間であいまいさを解消できる必要があります。この場合、元のメンバーは T のみでテンプレート化されているのに対し、ペアは 2 つの型でテンプレート化されているため、明確化は簡単です。

代わりに、std::vector など、単一のパラメーター テンプレートを持つコンテナー用の特殊化が必要な場合は、テンプレートの特殊化をインスタンス化するかどうかをコンパイラが理解するのが混乱する可能性があるため、注意する必要があります。ここで、テンプレート T は std::vector またはオーバーロードの特殊化です。

template <T> std::<vector <T> foo::get() const 

メンバー関数を完全に特殊化しているため、提案された構文は機能しません。

template <>

ただし、T1 と T2 の 2 つの未指定の型を省略しています。

于 2009-08-23T13:41:44.693 に答える