4

引数ではなく、それ自体の中でテンプレートを使用する関数をどのように作成しますか?同じコンストラクターと関数を持つクラスがたくさんありますが、コンストラクター内で異なることを行うので、テンプレート値がどの関数になるかをスイッチに指示するために、数値を受け入れることができる関数を作成しようとしています(これは必要です) 。どうすればいいですか?

関数自体をテンプレート化するのではなく、テンプレートを関数に配置しても機能しません

これは機能しません

#include <iostream>

template <typename T> void function(uint8_t s, std::string str1, std::string str2, std::string str3){
        T var;
        switch (s){
            case 1:
                // var = class1();
                break;
            // case 2 ...
            // case 3 ...
            default:
                break;
        }
}

int main() {
        std::string str = "01234567";
        std::cout << function(1, str, str, str) << std::endl;

        return 0;
}
4

1 に答える 1

3

テンプレート引数を明示的に指定してみましたか?

function<uint8_t>(1, str, str, str);

編集:テンプレートはコンパイル時に解決されるため、希望どおりに実行することはできませんが、関数の引数は実行時に解決されます。したがって、コンパイル中、コンパイルは「s」の値が何であるかを認識しません。

あなたの目的には、ファクトリパターンが適切だと思います。Alexandrescuのファクトリメソッドパターンを参照してください

使用例:

typedef AbstractT* (*CreatorMethod)(std::string, std::string, std::string);
typedef Factory <AbstractT,uint8_t,CreatorMethod> TFactory;

TFactory tfact;

tfact.Register(1, &someCreatorMethod);
tfact.Register(2, &someOtherCreatorMethod);

std::string str = "01234567";

AbstracT* object = tfact.Create(1 str, str, str);
AbstracT* object = tfact.Create(2 str, str, str);
于 2012-05-31T00:48:23.920 に答える