c++ - C++ 元组类型到函数参数类型
问题描述
假设我有一个函数应该接受应该匹配元组类型的参数,我可以这样写:
using ArgsTuple = std::tuple<int, float>;
template<typename... Args,
class = typename std::enable_if<std::is_convertible<std::tuple<Args...>, ArgsTuple>::value>::type>
void function(Args... args)
{
}
但这实际上与真正拥有int
和float
作为参数不同,它采用所有类型的参数,然后将它们限制为只允许匹配类型。我如何能够以函数实际上将类型ArgsTuple
作为参数的方式解包元组,以便例如 Visual Studio 能够自动完成调用函数所需的类型。结果函数必须是自由函数。
解决方案
不确定你想要什么,而不是完全免费的函数(而是模板类中的静态方法),但我想你要求类似如下的东西
template <typename>
struct proFunc;
template <template <typename ...> class C, typename ... Ts>
struct proFunc<C<Ts...>>
{
static void func (Ts ...)
{ }
};
你可以用这种方式
using ArgsTuple = std::tuple<int, float>;
proFunc<ArgsTuple>::func(1, 2.f);
您还可以验证
static_assert( std::is_same<decltype(&proFunc<ArgsTuple>::func),
void(*)(int, float)>::value, "!" );
要获得更类似于自由函数的东西,您可以使用函数指针
auto funcPnt = &proFunc<ArgsTuple>::func;
funcPnt(3, 4.f);
推荐阅读
- cmake - 如何在没有实际链接的情况下在 CMake 中执行 target_link_libraries?
- react-native - 更新反应后得到警告:VirtualizedLists 永远不应该嵌套在具有相同方向的普通 ScrollViews 中
- r - 如何使用正则表达式、单词和或条件从字符串中提取
- php - 了解反射类
- c# - 没有为此 DbContext 配置数据库提供程序,即使将 DbContextOptions 传递给构造函数
- android - 分片回栈
- php - 关于 PHP 中可能最快的关系图算法的问题
- jquery - 获取表单元素中的复选框
- d3.js - 第一次加载时如何启动 D3 JS 树以可折叠模式呈现
- c# - 如何通信 MainWindow.xaml 和 UserControl.xaml?