C ++将模板化函子作为模板类型名传递

时间:2019-06-11 19:49:37

标签: c++

我有一个模板函数:

ack

可以与以下函子一起使用:

template <typename my_func> int foo(int x, int y) {
 my_func bar;
 return bar(x, y);
}

用法:struct _compare { int operator()(int x, int y) { return x-y; } };

实际上foo<_compare>(int x, int y)中存在一个紧密循环,因此我试图将指针传递给可以在编译时内联的函数。

现在,我想使用第三方库中的函数,该函数本身就是模板化的fuctor。新函子就像:

foo

而且我无法使其编译。我已经尝试过template<typename Scalar> struct _compare { Scalar operator()(const Scalar& a, const Scalar& b) const { return a-b; } }; 我已经尝试过

foo<_compare<char>>(int x, int y)

我尝试const char t = 0; foo<_compare<t>>(int x, int y); 并将foo<_compare>(int x, int y)更改为

foo

我肯定只需要template <typename my_func> foo(int x, int y) { my_func<char> bar; bar(x, y); }
有提示吗?

3 个答案:

答案 0 :(得分:5)

我的首选解决方案是像STL一样:始终将函数对象作为参数传递:

template<typename my_func>
void foo(int x, int y, my_func bar) {
    bar(x, y);
}

然后,my_func是模板类,lambda,非模板类甚至函数指针都没关系。就是这样。

用法:

foo(int x, int y, _compare{});
foo(int x, int y, _compare<char>{});
foo(int x, int y, [](int, int){ return false; });

Live example表明C ++完全消除了callable和函数调用及其结果。

此外,GCC ABI没有存储作为参数传递给函数的空类的存储,如果没有内联,则可以消除开销。

答案 1 :(得分:3)

以下代码可以完美地编译,但是如果将_compare2的名称更改为_compare则无法编译。也许这可能是您的问题。

#include <cstdlib>
#include <iostream>

struct _compare2 {
int operator()(int x, int y) { return x-y;  }
};

template <typename my_func>
int foo(int x, int y) {
 my_func bar;
 bar(x, y);
}

template<typename Scalar> struct _compare {
  Scalar operator()(const Scalar& a, const Scalar& b) const {
      return a-b;
  }
};

int main(int argc, char** args) {
        std::cout << foo<_compare2>(4,2) << std::endl;
        std::cout << foo<_compare<int>>(4,2) << std::endl;
        return EXIT_SUCCESS;
}

答案 2 :(得分:0)

您还可以在模板中使用函数指针

template <bool (*compare)(int, int)>
bool cmp(int i, int j)
{
    return compare(i, j);
}