C++自由函数可以别名吗?
Can C++ free functions be aliased?
我有一个命名空间,其中包含一个高度模板化的免费函数,例如:
namespace a
{
template<typename T, typename K, typename H>
void f(T t, K k, std::vector<H> h_vec = {})
{ /* body */ }
}
在另一个命名空间中,为了方便起见,我想为一堆特定的用法提供一些别名,例如:
namespace b
{
using my_specific_f = a::f<int,string,char>;
}
这将允许我为函数提供更好的命名,因为f
在我正在处理的代码库中非常通用(请记住,我在这里只提供简化的示例来说明这一点)。 但不幸的是,这显然是语言所禁止的。
所以在我的第二次尝试中,我尝试使用函数指针:
namespace b
{
auto my_specific_f = &a::f<int,string,char>
}
这通常有效,但就我而言,它不起作用,因为f
有一个默认参数,我想这会导致函数具有多个函数指针(在本例中为两个),并且只能使用三个参数版本。
在这一点上,我只是放弃了,只是简单地将其体内my_specific_f
调用重定向到f
:
namespace b
{
void my_specific_f(int i, string s, vector<char> v = {} )
{
a::f(i,s,v);
}
}
但是这个解决方案我不太喜欢,因为它会导致f
可维护性降低,以防更改其签名,因为所有重定向功能都需要一致调整,而我最初的计划是创建不止一个别名。
还有什么可以尝试的吗?在标准的未来版本中是否有可能或是否有可能?
您可以做的是将功能包装在通用 lambda 中,以便为其指定自定义名称。你可以这样做
auto my_really_informative_name = [](auto&&... args) -> decltype(auto) {
return f(std::forward<decltype(args)>(args)...);
};
这将参数完美地转发到f
,如果它的签名发生变化,它仍然会起作用,因为 lambda 可以接受任意数量的参数。
如果你想完美地转发(noexcecpt资格和SFINAE方式的返回类型)
auto my_really_informative_name = [](auto&&... args) noexcept(noexcept(f(std::forward<decltype(args)>(args)...))) -> decltype(f(std::forward<decltype(args)>(args)...)) {
return f(std::forward<decltype(args)>(args)...);
};
如果要确保传递给函数的类型属于某种类型,则可以在函数调用中显式指定它们,例如
auto my_really_informative_name = [](auto&&... args) -> decltype(auto) {
return f<int, std::string, char>(std::forward<decltype(args)>(args)...);
};
相关文章:
- 部分定义/别名模板模板参数
- 如何在C++20中创建模板别名的推导指南
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 告诉c++编译器该参数没有别名
- 将自由函数绑定为类成员函数
- 静态数组的自由动态数组
- boost::spirit::karma 替代生成器,带有 boost::variant 由字符串和字符串别名组成
- 继承模板类中的类型别名
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 为什么 GCC 在使用类型别名时处理 const reinterpret_cast不同?
- 调试和自由执行中的信号处理
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 为什么我们不能重复使用具有不同模板参数的别名模板标识符?
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- 如何使用类型别名从模板化类中隐藏模板列表
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 模板模板参数和模板别名:编译器错误?
- 使用定义函数模板别名
- 为模板参数包添加别名
- C++自由函数可以别名吗?