Существует устаревшая реализация строки, в которой есть операция << для добавления символа:
struct FancyString {
FancyString& operator << (char c) {
// append c to the end
return *this;
}
// ...
};
Добавление символов работает так, как и ожидалось, но если кто-то по ошибке попытается сделать это с типами, которые могут быть преобразованы в char, поведение будет удивительным.
FancyString fancyString;
fancyString << 'c'; // As expected
fancyString << 3.14; // Surprise
Как я уже упоминал, это устаревший код, и, к сожалению, идеальное решение (полное прекращение поддержки этого класса) для меня не вариант. Я также не хочу реализовывать все разумные потоковые операции. Минимальной проблемой было бы запретить эту операцию для всех типов, кроме символов.
Как я могу предотвратить эту операцию для типов, отличных от [подписанного или беззнакового] char
? Я хочу, чтобы компилятор выдал ошибку в строке, где добавляется двойное число.
Если вы можете использовать C++20, это сделает это:
#include <concepts>
template<typename T>
concept IsChar = std::is_same_v<T,char>;
struct FancyString
{
FancyString& operator<< (IsChar auto c)
{
return *this;
}
};
int main()
{
FancyString str;
str << 'a';
//str << 1.23; <== this will now no longer compile
}
Мне нравится ваше решение, разве это не повод возобновить мой вопрос?
@DmitryKuzminov • это решение представлено в одном из дубликатов. (Мне тоже нравится это решение. Хотелось бы, чтобы я не застрял на C++17.)
Добавьте эту функцию-член в FancyString:
template <typename T> FancyString& operator<<(T) = delete;