Можно ли вернуть целое число из функции шаблона? - PullRequest
4 голосов
/ 15 ноября 2011

Я хочу написать шаблон функции знака.Я сделал это так:

template<class T> T sign(const T &value)
{
    if (value > 0) return 1;
    else if (value < 0) return -1;
    return 0;
}

Это работает, но я не уверен, будет ли хорошо возвращать числовое значение, когда на самом деле моя функция должна возвращать T. Хороша ли эта функция?

Ответы [ 5 ]

7 голосов
/ 15 ноября 2011

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

В этом случае он завершится неудачно во время компиляции.

Если вы хотите, чтобы это былоцелое число по замыслу, объявить его так.

template<class T> int sign(const T &value)
{
    if (value > 0) return 1;
    else if (value < 0) return -1;
    return 0;
}
2 голосов
/ 15 ноября 2011

Есть ли причина, по которой вы используете T в качестве типа возврата?Вы должны рассмотреть вопрос об изменении его на некоторый интеграл или enum{USINGNED,ZERO,SIGNED}.В этом случае ваша функция будет работать до тех пор, пока у T перегружены операторы > и <.

2 голосов
/ 15 ноября 2011

Ваша функция будет компилироваться только при неявном преобразовании из int в T.Если это ваше намерение, то все в порядке, но на самом деле выглядит не очень хорошо.

Я думаю, будет лучше, если вы переписываете свой код, чтобы вернуть T, возможно, используя что-то вроде:

//return T(0);
return static_cast<T>(0); // Better alternative as suggested by Steve Jessop

Это явно создает T из int.Имейте в виду, что если кто-то вызывает этот метод с T, который может конструировать из int, он будет работать - независимо от того, что на самом деле означает этот конструктор.

1 голос
/ 15 ноября 2011

Пока вы можете разыграть -1/0/1 до T, это именно то, что произойдет.Я считаю, что вы хотите добиться того, чтобы иметь знак того же типа, что и ввод, поэтому единственное, что вы можете сделать, это добавить явное приведение, которое почти не будет иметь значения - как заметил Стив в комментариях, это будет иметь значение в зависимости от Tявный конструктор.

0 голосов
/ 15 ноября 2011

Я думаю, что все в порядке, потому что T будет числом, поскольку вы хотите узнать знак.Давайте посмотрим на функцию вызывающей стороны.

double x = -5.2;
int ret = sign(x);

в последнем выражении, знак будет возвращать константу int, которая будет присвоена ret (неявное приведение типа, если требуется);

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