Я хочу написать функтор, который сравнивает строковый тип с другим. Одна сторона сравнения устанавливается один раз при инициализации и используется повторно.
В любом случае я хочу поддерживать типы 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
мне нужна как минимум возможность хранить строки с различной шириной символов, а также иметь выбор между значением и ссылочным типом.