gpt4 book ai didi

C++ 模板编程 : how to call type's function?

转载 作者:行者123 更新时间:2023-11-30 00:35:32 25 4
gpt4 key购买 nike

我是 C++ 模板编程的新手。

我想做的是为它的项目的某个属性编写一个具有固定容量的通用容器。

template <typename T >
class SinkContainer{

std::list<T> _buffer;

int sum(); // i don't know how to implement this :-(
public:
void push_back(T a);
}

类型 T 可以是

Class Client{
public:
int num_of_accounts;
}

class Supplier{
public:
int num_of_warehouse
}

容器只能包含MAX_NUM个账户或仓库,这意味着每次我们插入缓冲区时,我们都需要总结当前账户总数或仓库数。

谁能建议一种编写这个通用容器的方法?我应该为 ClientSupplier 覆盖 + 吗?

最佳答案

这通常使用所谓的 traits 类来解决。基本上,您定义一个适配器,为您的模板提供统一的接口(interface)。

// Traits class definition
template <class T>
struct SinkSumTraits;

template <>
struct SinkSumTraits<Client>
{
static int summand(const Client &c) { return c.num_of_accounts; }
};

template <>
struct SinkSumTraits<Supplier>
{
static int summand(const Supplier &s) { return s.num_of_warehouse; }
};


// Traits class usage

template <typename T >
class SinkContainer {
std::list<T> _buffer;

int sum()
{
return std::accumulate(
_buffer.begin()
, _buffer.end()
, 0
, [](int s, const T &a) { return s + SinkSumTraits<T>::summand(a); }
);
}
public:
void push_back(T a);
}

注意:如果您没有 C++11(对于 sum() 中使用的 lambda),只需将其替换为 SinkSumTraits<T>::summand() 的其他用法即可.

关于C++ 模板编程 : how to call type's function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18736281/

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