gpt4 book ai didi

c++ - 将类或函数作为模板参数

转载 作者:太空狗 更新时间:2023-10-29 23:20:04 29 4
gpt4 key购买 nike

我不确定要搜索什么,所以我会尽力解释清楚。在 STL 中,std::set 定义为

template <class Key, class Compare, class Allocator> class set;

来自 http://cplusplus.com :

Compare:比较类:接受两个与容器元素类型相同的参数并返回 bool 值的类。表达式 comp(a,b),其中 comp 是此比较类的对象,a 和 b 是容器 [...] 的元素。这可以是实现函数调用运算符的类或指向函数 [...] 的指针。

我说的是 Compare 模板参数。

所以如果我要写一个模板类,它有一个模板参数,它是一个实现函数调用运算符的类,我会写

template <class T, class Combine>
class MyClass
{
public:
Combine func;
MyClass()
{
func = Combine();
}
T do_it(T a, T b)
{
return func(a, b);
}
};

class IntCombine
{
public:
int operator () (int a, int b)
{
return a + b;
}
};

//...
MyClass<int, IntCombine> ob;
ob.do_it(4, 5);

或者,如果我这样写,那么第二个模板参数是一个函数:

template <class T, T Combine(T, T)>
class MyClass
{
public:
Combine func;
MyClass()
{
func = Combine;
}
T do_it(T a, T b)
{
return func(a, b);
}
};

int IntCombine(int a, int b)
{
return a + b;
}

//...
MyClass<int, IntCombine> ob;
ob.do_it(4, 5);

但是,在 STL 中,您可以通过任何一种方式使用集合类。这是如何实现的?仅当我定义的 ob 中的第二个模板参数分别是实现 operator () 的类或函数时,上面的代码才有效,但我不能写 MyClass 这样两者都可以工作。

我的示例可能看起来毫无用处。基本上我想写一个可以组合元素的容器,它和 STL 容器一样通用。

最佳答案

The above code works only if the second template parameter in my definition of ob is either a class implementing operator () or a function, respectively, but I cannot write MyClass so that both will work.

是的,你可以:

template <typename F>
struct foo {
F f;
void call() {
f();
}
};

void function() {
std::cout << "function called" << std::endl;
}

int main() {
foo<void(*)()> a = { function };
a.call();
}

这正是在 example of the std::set constructor 之后.重要的一点是,如果你使用函数指针,模板参数不是那个函数指针,它是函数指针的类型(这里是void (*)())。您需要单独存储实际的函数指针。

关于c++ - 将类或函数作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4480547/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com