2016-05-29 9 views
-2

は、誰もが次のテンプレートの特殊化のための一般的なテンプレートフォームを宣言する方法を知っているです:メンバ関数ポインタを使ってテンプレートクラスを作成する方法は?

template <template <class> class Container, 
      class Value, 
      class Return, 
      Return (Container<Value>::*Apply)(const Value &)> 
class Example<Container<Value>, Apply> 
{ 

}; 

Applyは、メンバ関数whoes署名へのポインタでなければならないテンプレート宣言では不明です。

+0

もう1つ質問:C++ 98で可能ですか? – Razial

+0

バリデーションテンプレートパラメータと 'std :: function'の何か? –

答えて

0

このような意味ですか?一例として、

template<typename T, typename F> 
struct S; 

template<template <typename...> class C, typename R, typename... A> 
struct S<C<A...>, R(A...)> { 
    using Apply = R(C<A...>::*)(A...); 
    // ... 
}; 

template<typename... U> 
struct T { 
    int f(int, char) { return 42; } 
}; 

template<typename T, typename F> 
struct S; 

template<template <typename...> class C, typename R, typename... A> 
struct S<C<A...>, R(A...)> { 
    using Apply = R(C<A...>::*)(A...); 
    // ... 
}; 

int main() { 
    S<T<int, char>, int(int, char)>::Apply apply = &T<int, char>::f; 
} 

はかなり醜い、確かに、それはOPが(多分)尋ねたものです。

+0

私はC++ 11エイリアシングでは一度も働いていないので、それが私に役立つのかどうかは言い難いです。考え方は変数をアドレスに格納するのではなく、コンパイル時にメンバ関数のアドレスを取得することです。 – Razial

+0

特定のオブジェクトのメンバ関数アドレスを取得するには、クラスのインスタンスが必要ですが、コンパイル時にメンバ関数のポインタ型を取得できます。このスニペットはそれを行い、 'Apply'という名前を付けます。 – skypjack

+0

本当にありません。メンバ関数ポインタを得るためのクラスのインスタンスの必要はありません。次のコードを試してください: 'template class T {public:void func(AnyExistingClass * obj){obj - > * f(); }}; '。それは仕事です。 – Razial

関連する問題