0

intテンプレートパラメータのいずれかまたはstd::vector<int>依存を返すテンプレート関数を作成したいと思います。例えば:

struct ReturnInt {};
struct ReturnVec {};

[...]

int num = func<ReturnInt>();
std::vector<int> nums = func<ReturnVec>();

私は、TMPの非常に限られた経験に基づいて、これを素朴に実装しようと試みてきました。std::enable_if明示的なテンプレートの特殊化、、、std::conditionalおよび/またはSFINAEに沿った何かが含まれるべきだと思います。しかし、これをコーディングしようとする私の試みはどれもコンパイルされず、簡単なテストで実行されることは言うまでもありません。

このリターンタイプの切り替えはどのように実装されますか?

編集:コメントに記載されているように、これは私の実際の問題を単純化したものです。それが役に立ったら、私はテンプレートパラメータを受け入れるクラスを持っています。パラメータに応じて、そのget()メソッドが単一のオブジェクト/値、またはオブジェクト/値の標準コンテナのいずれかを返すようにします。

4

1 に答える 1

2

あなたの編集に基づいて、ボグ標準のテンプレートの特殊化が必要です

struct ReturnsInt{};
struct ReturnsVec{};

template<typename T>
class Foo {};

template<>
class Foo<ReturnsInt> {
public:
    int get() { return 3; }
};

template<>
class Foo<ReturnsVec> {
public:
    std::vector<int> get() {
        return {3};
    }
};

テンプレートに基づいて 1 つのメンバー関数のみを変更し、残りのクラス定義を再利用する場合は、ヘルパー クラスを使用できます。

struct ReturnsInt{};
struct ReturnsVec{};

class helper_Foo {
public:
    string bar() {
        return "this is a shared method";
    }
};

template<typename T>
class Foo : public helper_Foo {};

template<>
class Foo<ReturnsInt> : public helper_Foo {
public:
    int get() { return 3; }
};

template<>
class Foo<ReturnsVec> : public helper_Foo {
public:
    std::vector<int> get() {
        return {3};
    }
};
于 2012-09-17T03:07:37.567 に答える