【发布时间】:2020-07-20 22:01:52
【问题描述】:
我想编写一个仿函数,将类似字符串的类型与另一个进行比较。比较的一侧在初始化时设置一次并重复使用。
无论如何我想支持的类型是std::basic_string、std::basic_string_view 和char*,但其他像std::byte* 以及std::array 和std::vector 也很有趣。
我的第一个实现如下所示:
template<typename StringType>
class StrcmpAlgorithm {
StringType pattern;
public:
StrcmpAlgorithm(const StringType& p) : pattern(p) {}
template<typename InputString>
bool operator()(const InputString& input)
{
return input == pattern;
}
};
但是,这个解决方案非常有限,因为等于运算符的使用限制了我可以使用的类型,甚至可能做错事(例如与 C 字符串比较时)。
我不确定我应该如何处理这个问题。为呼叫操作员提供多个重载?使用 constexpr-if 并检查类型?
本质上,将比较的 lhs 设置为模板参数 (StringType) 并将 rhs 设置为不同的模板参数 (InputString) 会导致组合问题,即使 STL 已经提供了所有可能的比较。消除其中一个将使整个事情变得容易得多。但是对于pattern 成员,我至少需要能够存储具有不同字符宽度的字符串,以及在值和引用类型之间进行选择。
【问题讨论】: