如何为函数指定替代名称?

How can I give alternative names to functions?

假设我有一个名为 get_color:

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

我也想拥有相同的功能,但使用 en-gb 拼写,即 get_colour。我可以做一个相同的函数并像这样调用 get_color 函数:

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

但这可能很难维护。有没有其他方法可以给函数起第二个名字?

C-style 宏可以,但我不喜欢宏。

#define get_colour(x) get_color(x)

auto get_colour(get_color);

是一种方式。如果你想支持重载函数,需要多考虑一下。

我只是把它写在这里作为答案,因为我不能将它再次标记为 C++11: How to alias a function? or 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 调用映射到 get_color。对于 none 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, 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, 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, [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
        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, 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, 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, QWORD PTR [rsp]
        cmp     rdi, rbx
        je      .L8
        call    operator delete(void*)

或者使用对免费和会员功能都有效的完美转发:

void get_color() {
}

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

对于c++11 -> decltype(get_color(std::forward<Args>(args)...)) 需要添加:

template <typename... Args>
auto get_colour(Args&&... args) -> decltype(get_color(std::forward<Args>(args)...)) {
  return 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;
    }

查看更多信息here

你也可以使用引用变量。

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 或更高版本