Перегрузка c ++ Typecasting (функции) - PullRequest
9 голосов
/ 12 мая 2011

Использование типов типов C ++ (все 4) выглядит точно так же, как некоторые шаблоны функций .например,

template<typename TO, typename FROM>
TO dynamic_cast (FROM p);

будет использоваться как,

dynamic_cast<Derived*>(p); // p is Base*

Почему не допускается их перегрузка по языковым стандартам для пользовательского использования?(например, мы можем перегрузить ключевые слова, такие как new/delete или другие operators)

Ответы [ 3 ]

4 голосов
/ 12 мая 2011

Почему не допускается перегрузить их в соответствии со стандартом языка для пользовательского использования?

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

Единственный известный мне встречный пример - это невозможность dynamic_cast между экземплярами умного указателя:

shared_ptr<Derived> pd = dynamic_cast<shared_ptr<Derived> >(pb);

Полагаю, что у способности сделать это были бы некоторые достоинства.

Я не знаю, обсуждали ли это добровольцы, которые делали всю работу в комитете по стандартам (и мне лень гуглить), но если бы это обсуждалось (и я быдумаю, что) он был отклонен либо потому, что кто-то считал, что недостатки перевешивают преимущества, либо потому, что никто не нашел время сделать достойное предложение и довести его до конца. 1


1 Не смейтесь.На самом деле, есть много вещей, с которыми большинство согласны, что это было бы неплохо, и которые не могут быть реализованы, потому что никто не удосужился сделать работу по написанию достойного предложения и тратить время, необходимое для обсуждения и итеративного улучшения, пока оно не будет выполнено.можно голосовать на.

2 голосов
/ 12 мая 2011

Я думаю, что причина та же, потому что вы не можете перегрузить ключевое слово языка.

На самом деле, вы должны видеть их как ключевое слово языка, а не как функцию шаблона, даже если look тот же самый.OTOH, я не мог себе представить, какие бедствия можно сделать, изменив значение этого конкретного аспекта C ++.

EDIT
Я был почти уверен, что кто-то придумал бывопрос: «тогда почему вы можете перегружать new / delete?».Я думаю, что настройка выделения / освобождения памяти - это то, что вам нужно в определенных сценариях, и преимущества перегрузки их перевешивают риски.Я не вижу никаких преимуществ в подрыве системы типов C ++, поэтому я не могу придумать сценарий, в котором это было бы полезно.Вы?

1 голос
/ 12 мая 2011

Преобразование указателя с dynamic_cast, reinterpret_cast и static_cast имеет четко определенные значения, и, вероятно, лучше не допускать перегрузки.
Было бы больно позволять пользователям изменять значение const_cast.

Остается только приведение типов объектов.

struct A
{
  A() {};
  template <typename FROM>
  A(FROM&)  {
    std::cout << "Casting to A \\o/" << std::endl;
  }

  template <typename TO>
  operator TO()  {
    std::cout << "Casting from A \\o/" << std::endl;
    return TO();
  }
};

затем

  int i; A a;
  A toA = static_cast<A>(i);  //  Casting to A \o/
  int fromA = static_cast<int>(a); // Casting from A \o/

Надеюсь, у вас есть варианты использования лучше, чем у меня:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...