私は、引数に対して全く同じ操作を実行するが、そうするために異なるセットの定数を使う2つの関数を持っているとしましょう。単純化しすぎたとえば:実際のアプリケーションで類似の関数を避けるためのテンプレートの使用
int foo1(int x){
return 3+4*x
}
int foo2(int x){
return 6-4*x
}
複数の引数と定数/リテラル、そしてもちろん計算がはるかに複雑になりますがあるだろうと仮定します。 簡潔さと保守性のために、私はfoo < 1>またはfoo < 2>を呼び出すことができるように、これら2つの関数を両方の関数を生成できるテンプレートとして書き直したいと思います。生成される。
int foo(int x, int funcType){
const int firstConst = (funcType==1) ? 3 : 6;
const int secondConst = (funcType==1) ? 4 : -4;
return firstConst+secondConst*x;
}
をしかし、私はいつも私が使用したい機能のコンパイル時に承知していますから、私は分岐を避けるために、テンプレートを使用したい:私は、私はこのような何かができることを承知しています。これを行う方法はありますか?
両方の答えは正しかったと、他の一つは動作するはずかかわらず、コンパイラ設定のが、この方法では、間違いなく読みやすいです。 – chessprogrammer
しかし、これはより多くの機能にうまく対応しません。私たちが保守性について話しているので、私はなぜこれがsongyuanyaoの答え(https://stackoverflow.com/a/46679563/4832499)のほうが好まれないのか分かりません。 –
@passer当然。Amdではなくても、constexpr構造体へのテンプレートポインターや、ADLタグディスパッチされたtraits関数は、IDを維持するだけであっても、 "call function '253'よりもスケーラビリティの高い関数を見つけることができます。 – Yakk