如何为函数指定替代名称?
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 或更高版本
假设我有一个名为 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 或更高版本