У меня есть две функции, которые возвращают логическое значение после сравнения двух значений, которые я передаю функции. Теперь на вопрос, как мы можем написать typedef, используя следующие две функции, чтобы охарактеризовать их и определить новый тип?
functions:
bool compare1(float n1, float n2){
return n1<n2;
}
bool compare2(int n1, int n2){
return n1<n2;
}
Я не вижу, чтобы typedef делал много хорошего здесь, но шаблон, безусловно, мог:
template <class T>
bool compare(T n1, T n2) {
return n1 < n2;
}
Обратите внимание, что это почти то же самое, что и std::less<T>
уже предоставляет, за исключением того, что std::less<T>
имеет специализации, поэтому он работает с некоторыми типами, для которых n1<n2
не обязательно даст значимые результаты. Это означает, что этот точный случай не очень практичен, но могут быть и другие случаи общей идеи.
В оригинальном случае вы не можете использовать typedef
. Вы можете создать typedef
для типа указателя на одну из функций:
typedef bool (*ptr_func)(int, int);
Но для этого все еще нужны указанные типы параметров, поэтому вы не можете использовать его для ссылки на обе функции, которые принимают int
параметры и функции, которые принимают параметры float
. Вы можете создать typedef
для указателя на функцию, которая принимает список вариационных аргументов, но даже если такая функция может принимать либо параметры int
либо float
, этот указатель не будет правильным типом для ссылки на любую из функций,.
using
в ответе Петра С. очень близок к typedef
; некоторые люди на самом деле называют это typedef
, хотя в нем есть другое ключевое слово.
using
может дать примерно аналогичный результат для typedef
. Не совсем ясно, что он выполняет что-то даже смутно похожее на то, чего действительно хочет ОП. Возможно, но я не уверен.
Если вы действительно хотите иметь псевдоним (aka typedef), то вот он:
bool compare1(float n1, float n2){
return n1<n2;
}
bool compare2(int n1, int n2){
return n1<n2;
}
template <typename T>
using Alias = bool(*)(T,T);
int main()
{
Alias<float> a = compare1;
std::cout << a(3.14f, 5.12f) << std::endl;
Alias<int> b = compare2;
std::cout << b(1, 2) << std::endl;
}
Возможно, вы хотите сделать что-то вроде этого:
template<typename T>
bool compare(T n1, T n2){
return n1 < n2;
}
typedef
не определяет новый тип, он создает псевдоним