如何给函数取其他名称?

问题描述

假设我有一个名为get_color函数

std::string get_color()
{
    return "green";
}

我还希望具有相同的功能,但是使用en-gb拼写,即get_colour。我可以做一个相同的函数,然后像这样调用get_color函数

std::string get_colour()
{
    return get_color()
}

但这很难维护。还有其他方法可以给函数命名吗?

解决方法

可以使用C样式的宏,但是我不喜欢宏。

#define get_colour(x) get_color(x)

,
auto get_colour(get_color);

是一种方式。如果要支持重载函数,则需要多加思考。

,

我在这里只写一个答案,因为我不能再次将其标记为C++11: How to alias a function?How do I assign an alias to a function name in C++?的重复项。

创建别名可以使用:

constexpr auto get_colour = get_color;
// or
constexpr auto get_colour(get_color);
const auto get_colour = get_color;
// or
const auto get_colour(get_color);

相对于以下优势:

auto get_colour = get_color;
// OR
auto get_colour(get_color);

是编译器将知道constexpr不会更改的const / get_colour版本,因此它可以将get_colour调用直接映射到{{1 }}。对于无get_color版本,您将对存储的指针有一个间接访问。

如果有

constexpr

您可以在#include <iostream> #include <string> std::string get_color() { return "green"; } auto get_colour = get_color; int main() { std::cout << get_colour() << "\n"; } 看到未内嵌,因为[QWORD PTR get_colour[abi:cxx11][rip]]可以更改:

get_colour

但是对于get_color[abi:cxx11](): lea rdx,[rdi+16] mov BYTE PTR [rdi+20],110 mov rax,rdi mov QWORD PTR [rdi],rdx mov DWORD PTR [rdi+16],1701147239 mov QWORD PTR [rdi+8],5 mov BYTE PTR [rdi+21],0 ret .LC0: .string "\n" main: push rbp sub rsp,32 mov rdi,rsp call [QWORD PTR get_colour[abi:cxx11][rip]] mov rdx,QWORD PTR [rsp+8] mov rsi,QWORD PTR [rsp] mov edi,OFFSET FLAT:_ZSt4cout call std::basic_ostream<char,std::char_traits<char> >& std::__ostream_insert<char,std::char_traits<char> >(std::basic_ostream<char,std::char_traits<char> >&,char const*,long) mov rdi,rax mov edx,1 mov esi,OFFSET FLAT:.LC0 call std::basic_ostream<char,QWORD PTR [rsp] lea rax,[rsp+16] cmp rdi,rax je .L8 call operator delete(void*) 版本:

constexpr

可以内联对#include <iostream> #include <string> std::string get_color() { return "green"; } constexpr auto get_colour = get_color; int main() { std::cout << get_colour() << "\n"; } 的函数调用(未调用get_colour),但是生成的代码直接出现在get_color[abi:cxx11]()中:

main:

或者使用完美的转发功能,该功能将同时适用于免费和会员功能:

get_color[abi:cxx11]():
        lea     rdx,0
        ret
.LC0:
        .string "\n"
main:
        push    rbp
        mov     edx,5
        mov     edi,OFFSET FLAT:_ZSt4cout
        push    rbx
        sub     rsp,40
        lea     rbx,[rsp+16]
        mov     BYTE PTR [rsp+20],110
        mov     rsi,rbx
        mov     QWORD PTR [rsp],rbx
        mov     DWORD PTR [rsp+16],1701147239
        mov     QWORD PTR [rsp+8],5
        mov     BYTE PTR [rsp+21],0
        call    std::basic_ostream<char,QWORD PTR [rsp]
        cmp     rdi,rbx
        je      .L8
        call    operator delete(void*)

对于c ++ 11 void get_color() { } template <typename... Args> auto get_colour(Args&&... args) { return get_color(std::forward<Args>(args)...); } ,需要添加:

 -> decltype(get_color(std::forward<Args>(args)...))
,

在cpp11中,您可以使用功能性标准库,这可以满足您的要求

#include <functional>
#include <iostream>
#include<string>

    std::string func()
    {
    return "hello";
    }
    
    int main()
    {
    std::function<std::string()> newfunc = func;
    
    std::cout << newfunc() << std::endl;
    
    return 0;
    }

有关更多信息,请查看this repository

,

您还可以使用参考变量。

std::string get_color(){
    return "green";
}

auto & get_colour = get_color;

,

这就是我最终要做的:

template<typename... Args>
auto get_colour(Args&&... args)
{
  return get_color(static_cast<Args>(args)...);
}

注意:仅适用于C ++ 14或更高版本