我刚刚在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
变成通用函数以避免代码冗余。我可以使用函数指针或模板来实现。暂且选择模板。我的想法是这样更好,因为编译器一定能够将函数内联-我正确吗?如果通过函数指针进行调用,编译器仍然可以内联调用吗?这是一个副问题。好的,回到原来的问题…一个模板解决方案:
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()
?
(是的,在这种情况下,函数指针似乎是一种解决方法 - 前提是它们也可以内联 - 但我正在寻找这类问题的通用解决方案)。