Каков наилучший способ переименования (псевдоним / пересылка) функции в C ++?

(Я ограничу этот вопрос C ++ 11, так как я считаю, что в C ++ 98 нет общего способа сделать это).

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

Например:

template<class A, class B, class C> 
D fun(A a, B& b, C&& c){ ... }

template<class E, class F> 
G fun(H<E> he, F& f){ ... }

... many other versions of fun

Теперь предположим, что я хочупереименовать (или жепсевдоним, или жевперед чтобы быть более точным) эти функции, все сразу (т.е. иметь возможность использовать другое имя для той же функции, не переписывая ее). Так, что в других частях кода я могу использовать его с другим именем и без изменения вышеуказанного кода.

Это правильный способпереименовать (Псевдоним / вперед)fun вgun?

template<typename... Args> 
inline auto gun(Args&&... args)->decltype(fun(std::forward<Args>(args)...)){
    return fun(std::forward<Args>(args)...);
}
Это действительно общее?Это самый простой способ?Это оптимальный путь? (например, может быть встроенным, без лишних копий)Что если исходная функция имела некоторые функции SFINAE? (например.template<class A, class B, class C, class = std::enable_if< ... >::type>), будемdecltype передать СФИНА во всех случаях?Что если исходная функция вернула ссылки? Разве decltype не собирается удалять тип ссылок? (например.double& fun(double& x){return x;}).То же самое можно сказать и о функциях-членах?

Разъяснение:gun никогда не будетименно так fun, поскольку экземпляры будут иметь разные адреса, но я ищу переименование точки зрения общего кодирования.

Комментарий: я нахожу странным, что почти все можно переименовывать / пересылать, пространства имен, типы (typedef) и типы шаблоновusing typedef, но не функции (или в этом отношении функции-члены).

РЕДАКТИРОВАТЬ: Для полноты, и так как кажется, что это способ сделать это, я добавил макрос для определения псевдонимов функций:

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

и затем вы используете это так:

namespace NS1{namepsace NS2{
  ALIAS_FUNCTION(NSA::fun, gun); // second argument (target name can't have namespace)
}}

Ответы на вопрос(1)

Ваш ответ на вопрос