Вопрос

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

После того, как некоторые смотрят на Google я нашел это http://www.devx.com/cplus/10minuteution/37078/1954.

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


void function(int& ints_only_please){}

int main () {char a = 0; int b = 0; Функция (а); Функция (б); }

Я показал код другу, и он предложил, я добавил const, прежде чем int, поэтому переменная не редактирована, однако, когда я начал компилировать штраф, но не стоит, смотреть ниже, чтобы увидеть, что я имею в виду


void function(const int& ints_only_please){}

int main () {char a = 0; int b = 0; Функция (а); // Компилятор должен остановиться здесь, но он не с функцией const int (b); }

Кто-нибудь знает, почему это?

Это было полезно?

Решение

Используйте шаблоны, чтобы получить желаемый эффект:

template <class T>
void foo(const T& t);

template <>
void foo<int>(const int& t)
{

}

int main(){
  foo(9); // will compile
  foo(9.0); // will not compile
  return 0;
}

Обратите внимание, что мы пишем только специальную версию шаблона для int Так что звонок, который имеет какой-либо другой тип в качестве параметра шаблона, приведет к ошибке компиляции.

Другие советы

Законно связать временный const ссылка, но неconst ссылка.

А. char может быть неявно преобразован в int и временный результат этого преобразования может быть связан с const int& Функциональный параметр, распространяющий время жизни временного действия до выходов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top