C++で一般的な方法で何かを実装する方法がわかりません。少し複雑なので、少しずつ説明させていただきます。
そのようなコードを考えてみましょう:
void a(int) {
// do something
}
void b(int) {
// something else
}
void function1() {
a(123);
a(456);
}
void function2() {
b(123);
b(456);
}
void test() {
function1();
function2();
}
簡単に気付くことができますが、同じことfunction1
をfunction2
行いますが、唯一の異なる部分は内部機能です。
function
したがって、コードの冗長性を回避するために汎用的にしたいと思います。関数ポインタまたはテンプレートを使用してそれを行うことができます。とりあえず後者を選びましょう。私の考えでは、コンパイラーは確実に関数をインライン化できるので、より良いと思います-私は正しいですか?関数ポインターを介して呼び出された場合でも、コンパイラーは呼び出しをインライン化できますか?これは副次的な質問です。
OK、元のポイントに戻ります...テンプレートを使用したソリューション:
void a(int) {
// do something
}
void b(int) {
// something else
}
template<void (*param)(int) >
void function() {
param(123);
param(456);
}
void test() {
function<a>();
function<b>();
}
大丈夫。しかし、私は問題に直面しています。ジェネリック自体a
である場合でも、それを行うことはできますか?b
template<typename T>
void a(T t) {
// do something
}
template<typename T>
void b(T t) {
// something else
}
template< ...param... > // ???
void function() {
param<SomeType>(someobj);
param<AnotherType>(someotherobj);
}
void test() {
function<a>();
function<b>();
}
テンプレートパラメータは次のいずれかになります。
- タイプ、
- テンプレートタイプ、
- タイプの値。
それらのどれも私の状況をカバーしていないようです。したがって、私の主な質問は、それをどのように解決するか、つまり function()
最後の例で定義するかということです。
(はい、関数ポインターはこの場合の回避策のようです-インライン化することもできます-しかし、私はこのクラスの問題の一般的な解決策を探しています)。