问题描述
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或更高版本