Как назначить псевдоним имени функции в C++?



создать новое имя для типа переменной или пространства имен. Но как мне назначить новое имя функции? Например, я хочу использовать имя holler на printf. #определить, является очевидным... а как иначе?



решения:




  1. #define holler printf

  2. void (*p)() = fn; //function pointer

  3. void (&r)() = fn; //function reference

  4. inline void g(){ f(); }

695   6  

6 ответов:

есть разные подходы:

  • С C++11 С не шаблонными не перегруженными функциями вы можете просто использовать:

    const auto& new_fn_name = old_fn_name;
    
  • если эта функция имеет несколько перегрузок, вы должны использовать static_cast:

    const auto& new_fn_name = static_cast<OVERLOADED_FN_TYPE>(old_fn_name);
    

    пример: есть две перегруженные функции std::stoi

    int stoi (const string&, size_t*, int);
    int stoi (const wstring&, size_t*, int);
    

    если вы хотите сделать псевдоним в первой версии, вы должны использовать следующее:

    const auto& new_fn_name = static_cast<int(*)(const string&, size_t*, int)>(std::stoi);
    

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

  • С C++14, вы можете пойти еще дальше с constexpr переменные шаблона. Это позволяет создавать псевдонимы шаблонных функций:

    template<typename T>
    constexpr void old_function(/* args */);
    
    template<typename T>
    constexpr auto alias_to_old = old_function<T>;
    
  • кроме того, начиная с C++11 у вас есть функция, которая называется std::mem_fn что позволяет псевдоним функции-члены. Рассмотрим следующий пример:

    struct A {
       void f(int i) {
          std::cout << "Argument: " << i << '\n';
       }
    };
    
    
    A a;
    
    auto greet = std::mem_fn(&A::f); // alias to member function
    // prints "Argument: 5"
    greet(a, 5); // you should provide an object each time you use this alias
    
    // if you want to bind an object permanently use `std::bind`
    greet_a = std::bind(greet, a, std::placeholders::_1);
    greet_a(3); // equivalent to greet(a, 3) => a.f(3);
    

вы можете создать указатель на функцию или ссылку на функцию:

void fn()
{
}

//...

void (*p)() = fn;//function pointer
void (&r)() = fn;//function reference
typedef int (*printf_alias)(const char*, ...);
printf_alias holler = std::printf;

должно сделать вас хорошо.

int (*holler)(const char*, ...) = std::printf;

используйте встроенную оболочку. Вы получаете оба API, но сохраняете единую реализацию.

С fluentcpp: ALIAS_TEMPLATE_FUNCTION (f, g)

#define ALIAS_TEMPLATE_FUNCTION(highLevelF, lowLevelF) \
template<typename... Args> \
inline auto highLevelF(Args&&... args) -> decltype(lowLevelF(std::forward<Args>(args)...)) \
{ \
    return lowLevelF(std::forward<Args>(args)...); \
}

Comments

    Ничего не найдено.