假设我有一个函数,该函数应采用与元组类型匹配的参数,我可以这样写:
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能够自动完成调用函数所需的类型。结果函数必须是自由函数。
答案 0 :(得分:2)
不确定要知道什么,也不完全是自由函数(而是模板类中的静态方法),但是我想您正在要求类似以下内容
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);