Qual é a melhor maneira de renomear (alias / forward) uma função em C ++?

(Vou restringir essa questão ao C ++ 11, pois acredito que não há uma maneira geral de fazer isso em C ++ 98).

Supostamente eu tenho um complicado (em termos de assinatura) conjunto demodelo funções e / ou funções sobrecarregadas, e eu quero usar essas funções exatamente da mesma maneira, mas usando um nome diferente (ou seja, um alias).

Por exemplo:

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

Agora suponha que eu querorenomear (oualiasoufrente para ser mais preciso) todas essas funções de uma vez (ou seja, ser capaz de usar um nome diferente para a mesma função sem reescrevê-la). De tal forma que, em outras partes do código, posso usá-lo com um nome diferente e sem modificar o código acima.

É este o caminho correto pararenomear (alias / forward)fun para dentrogun?

template<typename... Args> 
inline auto gun(Args&&... args)->decltype(fun(std::forward<Args>(args)...)){
    return fun(std::forward<Args>(args)...);
}
É verdadeiramente geral?É este o caminho mais simples?Este é o caminho ideal? (por exemplo, pode ser inlined, sem cópias desnecessárias)E se a função original tivesse alguns recursos do SFINAE? (por exemplo.template<class A, class B, class C, class = std::enable_if< ... >::type>), vaidecltype transferir o SFINAE em todos os casos?E se a função original retornasse referências? Não é o decltype para remover o tipo de referências ?. (por exemplo.double& fun(double& x){return x;}).O mesmo pode ser dito sobre as funções dos membros?

Esclarecimento:gun nunca vai serexatamente fun, como as instâncias terão endereços diferentes, mas o que estou procurando é uma renomeação para o ponto de vista da codificação genérica.

Comentário: Acho estranho que quase tudo possa ser renomeado / reencaminhado, namespaces, types (typedef) e tipos de modelousing typedef, mas não funções (ou para essa função de membro).

EDITAR: Para completar, e como essa parece ser a maneira de fazer isso, aqui adicionei uma macro para definir aliases de função:

#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)...); \
}

e então você usa assim:

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

questionAnswers(1)

yourAnswerToTheQuestion