0

私は最初にこの簡単な例が機能します(初めてマップを使用します)。名前と値のペアのタイプは、それぞれ関数ポインタへの文字列です。

#include <iostream>
#include <map>
using std::cout;

int foo() {
    return 243;
}

int main() {

    std::map<std::string, int (*)()> list;

    list["a"] = foo;

    cout << list["a"](); // 243

}

次に、テンプレートを使用してタイプを指定してみました。マップのインスタンス化でそれが言うところはint、テンプレートを使用してタイプを指定したいところです。だから私は試しましたが<int>、関数を呼び出すか、名前と値のペアを作成する場所を正確に知りません。これは私が試したものです:

#include <iostream>
#include <map>
using std::cout;

int foo() {
    return 243;
}

int main() {

    template <typename N>
    std::map<std::string, N (*)()> list;

    list["A"] = <int> foo; // right here where you see <int>

    cout << list["A"]();

}

私は<int>正しい場所に置いているとは思わないので、これはうまくいきません。私が得ているエラーは次のとおりです。

/tmp/134535385811595.cpp: In function 'int main()':
/tmp/134535385811595.cpp:11: error: expected primary-expression before 'template'
/tmp/134535385811595.cpp:11: error: expected `;' before 'template'
/tmp/134535385811595.cpp:14: error: 'list' was not declared in this scope
/tmp/134535385811595.cpp:14: error: expected primary-expression before '<' token
/tmp/134535385811595.cpp:14: error: 'N' was not declared in this scope

誰か助けてもらえますか?

4

1 に答える 1

3
template <typename N>
std::map<std::string, N (*)()> list;

template<typename>テンプレートの定義には構文が使用されます。マップクラステンプレートはすでに他の場所で定義されており、インスタンス化するときにのみテンプレートパラメータを提供できます。

マップをクラステンプレートでラップすることで、やりたいことができます。

template<typename ReturnType>
struct Wrapper {
    std::map<std::string, ReturnType (*)()> m;
};

次に、インスタンス化して次のように使用します。

int foo() { }

Wrapper<int> w;
w.m["foo"] = foo;
于 2012-08-19T12:32:14.843 に答える