c++ - 模板函数作为模板参数

标签 c++ templates dry generic-programming

我只是对如何在 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();
}

很容易注意到 function1function2 做同样的事情,唯一不同的部分是内部函数。

因此,我想使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>();
}

一切正常。但我遇到了一个问题:如果 ab 本身就是泛型,我还能这样做吗?

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()

(是的,在这种情况下,函数指针似乎是一种解决方法 - 前提是它们也可以内联 - 但我正在寻找此类问题的通用解决方案)。

最佳答案

为了用模板解决这个问题,你不得不使用模板模板参数。 不幸的是,您不能将模板模板函数作为类型传递,因为它必须首先被实例化。但是有一个虚拟结构的解决方法。这是一个例子:

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/55140578/

相关文章:

c++ - 模板类中的 Cython C++ 静态方法

c++ - 作业 : C++ Templates With Vectors

c++ - std::function 带模板,类型问题,没有匹配的调用函数

c++ - 在 C++ 中为类提供可访问的 "not repeat yourself"时,如何设置 "name"?

scala - 干燥对象/类默认构造函数中的样板

c++ - 如何使用GetWindowRect

C++ 即使发生错误也删除数组

c++ - 电子邮件 header 显示,dkim=hardfail(测试模式)和 dkim=permerror(错误信号)

c++ - 除了使 TMP 编译之外,::template 意味着什么

ruby-on-rails - 如何干燥重复的 Ruby 代码?