我只是对如何在 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()
?
(是的,在这种情况下,函数指针似乎是一种解决方法 - 只要它们也可以内联 - 但我正在寻找此类问题的通用解决方案)。 p>
最佳答案
为了使用模板解决这个问题,您必须使用模板模板参数。 不幸的是,您不能将模板模板函数作为类型传递,因为它必须首先被实例化。但是有一个虚拟结构的解决方法。这是一个例子:
template <typename T>
struct a {
static void foo (T = T ())
{
}
};
template <typename T>
struct b {
static void foo (T = T ())
{
}
};
struct SomeObj {};
struct SomeOtherObj {};
template <template <typename P> class T>
void function ()
{
T<SomeObj>::foo ();
T<SomeOtherObj>::foo ();
}
int main ()
{
function<a>();
function<b>();
}
关于c++ - 模板函数作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4697180/