2016-09-23 5 views
0

私は関数ポインタにマップ文字列を作成しようとしていますが、関数にはテンプレート引数があります。ここに私が試したものです:std :: map of string <->関数のテンプレート引数があるところ

template <typename T> 
using func = void (*) (T); 

std::map<std::string, func> funcMap; 
funcMap["test1"] = &Test::test1; 
funcMap["test2"] = &Test::test2; 

テストは、次のようになります。

class Test 
{ 
void test1(SomeClass arg) {} 
void test2(SomeOtherClass arg) {} 
}; 

は私が可能しようとしています何ですか?それについてもっと良い方法がありますか?ありがとう!

+4

メンバ関数は通常の関数と同じではないので、これはうまくいかないでしょう。これを見てください:http://stackoverflow.com/questions/1924844/stdmap-of-member-function-pointers – NathanOliver

+3

テンプレート引数を持つ関数はなく、テンプレートは型ではありません。マップ内のすべての値は同じ型でなければなりません。つまり、型は 'func'の同じインスタンスでなければなりません。 – molbdnilo

+2

これは何のために使用していますか?私たちがあなたが何をしようとしているのか分からない限り、「それについてもっと良い方法があるか」を判断することはできません。 "文字列とテンプレート関数の間のマップが必要です"と答えるのは避けてください。これは必須ではありませんが、別の問題を解決しようとしています*(実際に根本的な問題があると仮定します) – Yakk

答えて

0

あなたがしようとしているのは、タイプセーフなままでは不可能です。マップは、すべてのデータメンバーが同じタイプである必要があります。これは、コンパイラが返されたポインタがオブジェクトに対して呼び出すために有効であることを確認するために型チェックを行うことができるようにするためです。それはコードを生成するためのコンパイル時テンプレート(一般的な英語の意味で)です:

0

は、テンプレートが何であるかを考えてみましょう。テンプレートタイプエイリアスは型エイリアスを生成についての鋳型である:

template <typename T> 
using func = void (*) (T); 

funcない型あるいは型の別名です。 func<SomeClass>およびfunc<SomeOtherClass>は、である。具体的には、func<SomeClass>void (*) SomeClassの別名です。それは、特定のタイプの値に特定のタイプのキーをマップ:

さて、std::mapが何であるかを検討してください。すべての値の型は同じでなければならないので、クラステンプレートは実際の型であり、もはや型を生成するためのテンプレートにならないように完全に指定する必要があります。

異なる引数を持つ関数(またはメンバ関数)ポインタを呼び出す場合は、型システムを迂回しない限り、同じstd::mapにすべてを格納することはできません。あなたのmapの値型として、何らかの種類のタグ付き関数ポインタ型のunionを使用します。

(サイドノートとして:。?あなたはQtの名前付き信号-とスロットのフレームワークのようなものを実装しようとすることができるように見えるあなたは、単にQtのを使用して考えがあります)

0

それはCPLUSPLUSに言うように。 com "マップの各要素は、マッピングされた値としていくつかのデータを格納します。これが意味するのは、キーは何らかの値を必要とするということです。だから私はそれが直接異なる引数を呼び出す関数ポインタを格納するとは思わないが、私はこのプロジェクトで実装されている方法を使用してみてください - code

リンクの完全なコードを見て私はここでコードの小さな部分を追加しました:

std:: map<int,union shape_ptr> myData; 
myData[0].tri_ptr=&t1; 
myData[1].tri_ptr=&t2; 
myData[2].cir_ptr=&c1; 
myData[3].cir_ptr=&c2; 

std::map<int, union shape_ptr> :: iterator it=myData.begin(); 
for(it=myData.begin();it!=myData.end();it++) 
{ 
    do_poly(it->second); //do_poly call the function from map 
} 
+0

あなたの答えに関連コードを含めて、外部リンクが壊れても有用なままにしてください。 – doldt

関連する問題