2016-09-13 17 views
2

私は完全にC++を新しくしました。同じ戻り値の型とパラメータ型を持つn個の関数を1行に順番に定義する方法があるのでしょうかDRYコードを維持する。同じ戻り値の型とパラメータ型を持つ複数のプライベート関数を1行に定義する

私は解決策をオンラインで探していましたが、適切な答えを見つけることができませんでした。例えば

myHeader.h

class MyClass{ 

public: 
    . . . 

private: 
    . . . 
    std::vector<Dcel::Vertex*> addVertices(std::vector <Dcel::Vertex*>); 
    std::vector<Dcel::Vertex*> randomPointsGetter(std::vector<Dcel::Vertex*>); 
}; 

、それらの両方がstd::vector<Dcel::Vertex*>タイプを返し、パラメータ入力としてstd::vector <Dcel::Vertex*>を取ります。

これらの関数またはn個の関数を同じ行に定義することはできますか?はいの場合、どのように?

ありがとうございます。

+1

ありません、それは不可能です。編集:あなたは私が推測するマクロでうまくいく可能性があります。 – AndyG

+1

'F = std :: vector (std :: vector );を使用して関数型を指定する型エイリアスを使用することができます。 F addVertices、randomPointsGetter; 'を使用しますが、使用しないでください。 – cpplearner

+3

名前からは、これらの関数の間に固有の関係はないので、それらが同じインタフェースを持つという事実は、文書化され維持されるべき基本的な性質ではありません。それは単に偶然のことです。 「DRY」は過度の単純化である。あなたがするべき時を除いて、あなた自身を繰り返さないでください。 –

答えて

2

機能の数が増えると、マクロが適切と思わ:

class MyClass { 

#define MY_PREFIX_DECL_FN(name) \ 
    std::vector<Dcel::Vertex*> name(std::vector<Dcel::Vertex*>) 

    MY_PREFIX_DECL_FN(addVertices); 
    MY_PREFIX_DECL_FN(randomPointsGetter); 
    MY_PREFIX_DECL_FN(...); 

#undef MY_PREFIX_DECL_FN 

}; 
+0

'definition'と' typedef'を組み合わせるのが最善の選択でしょうか?つまり、 'MY_PREFIX_DECL_FN(addVertices);のような全体定義で' 'define'は完璧ですが、' 'typedef td :: vector VertexPointersList;を使う' void buildTetrahedron(VertexPointersList);非常に良い。右? – AndreaM16

+1

@ AndreaM16確かに。あなたが望むなら、マクロ内のtypedefをうまく使うことができます。 – Quentin

+0

ありがとう@クエンティン。 – AndreaM16

3

typedefを使用すると、重複を減らすことができますが、同じ行に複数の関数を定義することはできません。

typedef std::vector<Dcel::Vertex*> VertexList; 

VertexList addVertices(VertexList); 
VertexList randomPointsGetter(VertexList); 
+0

ありがとうございました! – AndreaM16

7

それは同じラインに、それらの両方、またはn個の関数を定義することは可能ですか?はいの場合、どのように?

すべての空白はC++で等しく扱われます。

T function(); T another_function(); 

あなたは1フル表現、または「共有」、戻り値の型で複数の関数を宣言することができるかどうかを意味している場合、いいえ、それが不可能である:ここでは、同じ行で宣言された二つの機能があります。

using R = std::vector<Dcel::Vertex*>; 
R addVertices(R); 
R randomPointsGetter(R); 

編集:あなたが繰り返しstd::vector<Dcel::Vertex*>の複雑さを嫌う場合


、エイリアスを使用することができます。このusing宣言は、ジョシュ・ケリーの答えに示すようtypedefと意味的に等価です。

+0

ありがとうございます。基本的には、 'using'や' typedef'を使うのはほとんど同じですか? – AndreaM16

+1

@ AndreaM16彼らはまったく同じです。 'using'構文はC++ 11以降で利用できますので、コンパイラが古い場合は' typedef'を使用してください。どのタイプがどれで、別名がどれであるかが覚えやすいので、私は 'using'を好む。 – user2079303

+0

ありがとう@ user2079303。 – AndreaM16

1

はい。

あなたはstd::vectorstd::arrayのいずれかを使用してN関数を定義することができます。

std::vector< std::function(std::vector<Dcel::Vertex*>(std::vector <Dcel::Vertex*>)) > my_private_functions; 
std::array< std::function(std::vector<Dcel::Vertex*>(std::vector <Dcel::Vertex*>)),N > my_private_functions; 
+0

しかし、これらの宣言された関数はクラスのメンバーではありません。 – AndyG

+0

'auto const&addVertices = my_private_function [0];のようなエイリアス名をいつでも使うことができます。自動const&randomPointsGetter = my_private_function [1]; '。そして、このクラスのインスタンスのメソッドを使用しているようです。 –

関連する問題