typedef в C ++ для подведения итогов и определения нового типа с двумя функциями

0

У меня есть две функции, которые возвращают логическое значение после сравнения двух значений, которые я передаю функции. Теперь на вопрос, как мы можем написать typedef, используя следующие две функции, чтобы охарактеризовать их и определить новый тип?

 functions: 
    bool compare1(float n1, float n2){
      return n1<n2;
    }

    bool compare2(int n1, int n2){
      return n1<n2;
    }
  • 0
    Чего вы хотите добиться с помощью такого typedef?
  • 0
    не совсем понимаю, о чем вы спрашиваете, но typedef не определяет новый тип, он создает псевдоним
Показать ещё 2 комментария
Теги:
function
typedef

3 ответа

3

Я не вижу, чтобы 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, этот указатель не будет правильным типом для ссылки на любую из функций,.

  • 0
    Синтаксис using в ответе Петра С. очень близок к typedef ; некоторые люди на самом деле называют это typedef , хотя в нем есть другое ключевое слово.
  • 0
    @anatolyg: Да, начиная с C ++ 11, using может дать примерно аналогичный результат для typedef . Не совсем ясно, что он выполняет что-то даже смутно похожее на то, чего действительно хочет ОП. Возможно, но я не уверен.
2

Если вы действительно хотите иметь псевдоним (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;
}

LIVE DEMO

  • 0
    Хороший пример (каким бы искусственным он ни был) для использования шаблонов и [C ++ 11] [using-декларация].
1

Возможно, вы хотите сделать что-то вроде этого:

template<typename T>
bool compare(T n1, T n2){
  return n1 < n2;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню