1

関数のオーバーロードを回避し、テンプレートを使用してより汎用的な関数を書く方法はありますか?現在、私のコードは次のようになります。上記で異なる入力引数と異なる戻り型のテンプレートを使用する汎用関数

placement Detect::predict(Eigen::Array<double, rowSize, 1> &feature) 

position Detect::predict(std::unordered_map<std::string, std::vector<double>> &feature) 

placementpositionは、さまざまなカテゴリとのENUMSです。

templateを使ってどうすればいいですか?

+1

IMOあなたの機能でテンプレートを使用する方法はありません。 – FieryCod

+0

だから私の理解を明確にするために、入力引数と戻り値の型はテンプレートを使うために同じでなければならないのですか? –

+1

引数と戻り値の型はテンプレート引数と同じである必要はありませんが、両方の型を扱うことができる単一の関数を作成する単純な方法や優雅な方法はありません。テンプレート?どちらか一方または両方、あるいは両方?どのように実装を区別しますか? 2つの関数の間に共通のコードがある場合は、代わりに呼び出すことができる3つ目の関数に共通のコードを記述すると、ここではオーバーロードが最良の方法です。 –

答えて

1

投稿したコードから始めて、同じクラスと名前を使用するソリューションを提供することはできません。
とにかく、あなたはsfinae式に頼ってやっていることをやることができます。例として

:引数の型はintであれば上記の例で

#include<type_traits> 

template<typename T> 
constexpr 
std::enable_if_t<std::is_same<T, int>::value, char> 
func(T) { return 'c'; } 

template<typename T> 
constexpr 
std::enable_if_t<not std::is_same<T, int>::value, int> 
func(T) { return 42; } 

int main() { 
    static_assert(func(42) == 'c', "!"); 
    static_assert(func(.0) == 42, "!"); 
} 

funcは、それ以外の場合はintを返し、charを返します。
必要に応じて、タイプとサイズを調整するだけで済みます。

私はOPがオーバーロードして行くべきではないとは言いませんよ。代わりに、私はそれがこの場合には良いと思う。
この回答は、テンプレートを使用してOPがターゲットにどのように到達できるかを示すことのみを試みます。

+0

ありがとう。それに応じて私のコードを変更できるかどうかを見てみましょう。 –

+0

Downvoters:少なくともコメントはdownvoteが何であるかを知るのに役立ちます。ありがとうございました。 – skypjack

0

はい、できます。 私は、コンテナが型として渡されている状態で検出関数をテンプレート化するとします。

する必要があるのは、希望の戻り値の型をコンテナの型に関連付けることです。既存の固定関係がない場合は、型特性概念を使用できます(別の回答で使用されている型特性ヘッダーを意味するものではありません)。

基本的に、typedefまたはusingステートメントを含む新しいテンプレートクラスを作成します検出関数の戻り値の型として使用されます。これらの戻り値の型は列挙型をラップできます。

は、あなたが使用する必要があるコンテナタイプごとに、この特性クラスを特殊(ここでは、テンプレートテンプレートパラメータを使用する必要があります)

私は今の例を与えることはできませんが、私はより多くを持っているときの答えを更新します申し訳ありません時間と適切なキーボードが必要な場合はさらに。

+0

Roxに感謝します。現在のところ、一定の関係はありません。あなたが例を挙げていただければ幸いです。 –

関連する問題