Пример кода:
#include
struct A
{
int a;
explicit operator std::string() {
return "<" + std::to_string(a) + ">";
}
};
void f(std::string s) {
std::cout << s << std::endl;
}
int main()
{
A a {1};
f(static_cast
Вопроса 2:
1) Можно ли запретить приведение типов в С-стиле, так, чтобы на вызов f(std::string(a)) или f((std::string)a) компилятор ругался, а f(static_cast
2) Как "научить" срабатывать вызов f(boost::lexical_cast
Ответ
Что касается запрета приведения в стиле C, могу только посоветовать посмотреть в сторону опций компилятора. В GCC, например, можно добавить флаги -Wold-style-cast и -Werror, тогда приведение в стиле C будет вызывать предупреждение, а предупреждения будут трактоваться как ошибки.
С boost::lexical_cast все просто, нужно добавить специализацию шаблона. Ваш пример примет такой вид:
#include
struct A
{
int a;
explicit operator std::string() const{
return "<" + std::to_string(a) + ">";
}
};
namespace boost{
template<>
std::string lexical_cast
void f(std::string s) {
std::cout << s << std::endl;
}
int main()
{
A a {1};
f(static_cast
Комментариев нет:
Отправить комментарий