我有一个模板函数:
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);
}
。
有提示吗?
答案 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);
}