当我设计一个模板时
template<typename T,
typename QueueType,
typename = std::enable_if_t<std::is_same_v<QueueType, std::queue<T>> || std::is_same_v<QueueType, std::priority_queue<T>>>
class ThreadSafeQueue {
private:
QueueType q;
public:
T& get();
};
字符串
如图所示,QueueType
是std::queue或std::priority_queue;但是如果我想用T& get()
访问第一个元素,std::queue
的基本函数是front()
,而std::priority_queue
是top()
。那么如何设计T& get()
来访问第一个元素呢?
3条答案
按热度按时间c7rzv4ha1#
在C++20中,可以使用新的requires clause来执行以下操作:
字符串
演示:https://godbolt.org/z/Wa6x8Kdo9
你也可以在C++17中使用
if constexpr
。型
演示:https://godbolt.org/z/7vPoWrf1x
pgccezyw2#
可以委托给重载。
假设您希望两个示例化具有相同的接口,
get()
必须返回一个const引用,因为这是您从priority_queue::top
获得的。草图:
字符串
如果希望
queue
示例化具有可变的get()
,则需要类似于型
但我觉得这会让人很困惑
euoag5mw3#
一个 * 可以 * 提供专门化,一个 * 可以 * 提供重载(我认为后者比前者更上级)--但是人们也可以看看模板参数类是否提供了适当的函数!
这种测试的一个非常简单的变体可能如下所示:
字符串
实际上,这些测试对于提供相应函数但返回值为void的类会失败。在给定的情况下,这是无关紧要的,因为这样的函数无论如何都不会达到目的。对于一般情况,一个更精确的变体(在测试仅仅存在的意义上)可以如下所示:
型
有了这些测试,你现在可以使用
if constexpr
来测试哪个函数用于值检索:型
此变体的奖励:它也适用于 any 容器提供两个函数之一,例如
std::vector
或std::string
(在上面的实现中,如果容器同时提供两个函数,则front
将优于top
)。godbolt上的演示。