2017-04-03 12 views
2

私はstd::vectorの2つまたは異なるタイプを持っています。一般的なstd :: vector push_backのテンプレート関数の記述方法?

struct data{ 
    int a; 
    int b; 
    int c; 
}; 

std::vector<int> val1; 
std::vector<data> val2; 

は今、私はval1val2の両方のために働くだろうテンプレート関数を書きたいです。

template<typename t> 
void my_function(t s){ 
    s.push_back(...); // based on s i.e it could be std::vector<int> or std::vector<data> 
} 

my_function<std::vector<int>>(val1); 
my_function<std::vector<data>>(val2); 

私が直面しています問題は、私はタイプがある場合std::vector<int>s.push_back({1})のプッシュバック対std::vector<data>場合s.push_back({1,2,3});

+1

'{1}'と{1,2,3}はどうやって決定されますか?どのようにベクトル*を*で埋めるかを決める方法は非常に重要です。 – jwimberley

+0

std :: vector とstd :: vector は、コンパイラの決定に役立つでしょう –

+0

@vanta '{1,2,3}'ではなく '{7,8,9}'でしょうか? – Yakk

答えて

3

テンプレートを忘れてやるんので、コードに言うことができる方法です。単純なオーバーロードはあなたの問題を解決する必要があります。

void my_function(const data& d) { 
    val2.push_back(d); 
} 

void my_function(int n) { 
    val1.push_back(n); 
} 
+0

私はURの方法がかなりまっすぐであることを知っています。しかし、好奇心は依然として私が達成しようとしていることは不可能であるという疑問を懇願していますか?それは可能ですか? –

1

あなたは、たとえば行うことができます 、あなたはテンプレート関数を専門にしたいようだ:

struct data{ 
    int a; 
    int b; 
    int c; 
}; 

std::vector<int> val1; 
std::vector<data> val2; 

template<typename t> void my_function(t s); 

template<> 
void my_function(std::vector<int> s){ 
    s.push_back({1}); 
} 

template<> 
void my_function(std::vector<data> s){ 
    s.push_back({1,2,3}); 
} 

int main() 
{ 
    my_function(val1); 
    my_function(val2); 
} 
0

ない、それはあなたが探して何を確認してください...

my_function()std::vectorを除外し、このように含まれる型を抽出することができます。

template <typename T> 
void my_function(std::vector<T> & s) 
{ s.push_back(getTval<T>()); } 

(トピックオフ:パラメータs&を追加したことを確認してください。それ以外の場合は、ベクトルsをコピーとして渡します。push_back()は、ファンクションから破棄されたコピーにのみ値を追加します)。

しかし、この解決策では、関数の特殊化は必要ありません。それは単にgetVal()の実装でこの必要性を移動させるだけです。

template <typename T> 
T getTval(); 

template <> 
int getTval<int>() 
{ return 1; } 

template <> 
data getTval<data>() 
{ return {1, 2, 3}; } 

my_function()push_back()がベクターに含まれるデータは、コードを変更する点のみであり、優れた、複雑な溶液である場合、これは有用であり得ます。そうでなければ、私はそれがより良いオーバーロードまたは同じを専門とすることができると思いますmy_function()

関連する問題