Можно ли перегрузить оператор * static_cast *? - PullRequest
6 голосов
/ 08 декабря 2011

Я определил класс A , фактические свойства не имеют значения.Можно ли определить специализацию оператора static_cast<class T>(int) для преобразования целых чисел в класс A?

До сих пор я делал это, определяя функцию convert , такую ​​как A convert(int).Но я бы предпочел использовать static_cast для согласованности с другими конверсиями.

Возможно ли это?
Я также хочу избежать неявных преобразований, поэтому я не делаю это с помощью конструктора A .

Ответы [ 7 ]

10 голосов
/ 08 декабря 2011

static_cast - это ключевое слово, поэтому вы ничего не можете перегрузить или переопределить там.Если вы хотите предоставить код, управляющий преобразованием целых чисел в class A экземпляры, напишите соответствующий конструктор в форме A::A(int).

Обновление: Если вы хотите избежать неявных преобразованийВы можете сделать этот конструктор explicit.Почему-то я не совсем прочитал последнее предложение вопроса, извинения.

8 голосов
/ 08 декабря 2011

Если вы хотите только избежать неявных преобразований. Почему вы не используете явное ключевое слово?

6 голосов
/ 08 декабря 2011

static_cast - ключевое слово языка, и вы ничего не можете изменить.Однако вы можете добиться того, что вы, с помощью явного конвертирующего конструктора:

class Foo
{
public:
    explicit Foo(int bar) { }  // Can't be called implicitly, CAN be invoked with `static_cast`.
};

Это работает, потому что язык определяет поведение static_cast с точки зрения конструирования объекта, вызывая преобразования соответствующим образом..

2 голосов
/ 08 декабря 2011

Да и нет.Вы не можете определить operator static_cast(), но static_cast всегда будет вызывать либо конструктор, либо оператор преобразования: для поддержки int в MyClass предоставьте MyClass конструктор, который можно вызвать с int;для поддержки MyClass до int, предоставьте MyClass с функцией operator int() const.

2 голосов
/ 08 декабря 2011

Если A имеет конструктор преобразования A(int), он будет вызван C ++ при использовании static_cast<A> для объектов типа int.

1 голос
/ 08 декабря 2011

Можно ли определить специализацию оператора static_cast (int) для преобразования из целых чисел в класс A

Нет.static_cast - это ключевое слово, а не шаблон или функция.

Однако в вашем классе A вы можете написать конструктор, который принимает int, если вы хотите такое поведение.

struct A
{
   A(int i) {}
};

A a = 10; //automatic conversion!

Или, если вам нужен синтаксический сахар, который должен выглядеть как гипс, тогда вы можете сделать это:

template<typename To, typename From>
To type_cast(From from)
{
    return To(from);
}

и использовать его как:

A a = type_cast<A>(10); //but why would you do that?

Но почемуВы делаете это?Я не вижу никакого преимущества в этом;поэтому я отговариваю вас от написания такого шаблона функции.Я показал вам это только для экспериментальных и образовательных целей.Такой код не должен найти место в реальном коде.

0 голосов
/ 08 декабря 2011

Почему бы не использовать конструктор, взяв int?

struct MyInteger
{
    MyInteger(int i);
};

int main()
{
    MyInteger i = 1234;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...