通过参数在多参数模板中推导出第一个模板参数

时间:2016-01-27 10:33:26

标签: c++ templates template-deduction

首先是我的问题,然后解释我正在尝试做什么,因为我可能正在解决问题。

是否可以在指定其他参数的同时从参数中推导出多参数模板中的第一个模板参数。

示例:

 template<class A, class B>
 B function(A object)
 { 
     return B(A);
 }

调用如:

 function<BType>(AInstance);

我找不到办法让这项工作。

编辑:另一个例子可能更适合我下面的问题,正如我收到的第一条评论

所示

示例:

 template<class A, A::B foo>
 void function(A object)
 { 
     object.doSomethingWithTypeA::B(foo);
 }

调用如:

 function<A::BInstance>(AInstance);

不同之处在于第二个模板参数取决于第一个模板参数的特定类型,因此我无法切换模板参数。

现在描述我想要做的事情:

我目前正在尝试创建一个模板通用仿函数类,它可以使用自由函数或成员函数并将其包装到仿函数中。

我成功完成了我的目标,但现在我想让一切变得更加用户友好。目前,创建仿函数的模板化函数如下所示:

template <class T, ReturnType (T::*Method)(FunctionArguments...)>
static constexpr UniversalFunctor Create(T* object) {
   return {object, MethodWrapper<T, Method>};
}

现在为用户必须调用的成员函数创建一个仿函数

UniversalFunctor<ReturnType>::Create<ClassName, ClassFunction>(Object)

这很麻烦。

由于Object必须是ClassName类型或者至少可以对此进行推理,我本来应该像以下那样调用:

UniversalFunctor<ReturnType>::Create<ClassFunction>(Object)

也应该能够成功,因为ClassName参数可以从传递的指针中推断出来。但是,这似乎不可能,因为ClassFunction总是被视为第一个模板参数。

1 个答案:

答案 0 :(得分:2)

不,您只能按声明的顺序指定模板参数。所以,你可以指定第一个,然后让第二个推导,但不是相反。

您可以为模板编写包装器:

template<class B, class A>
B function_wrapped(A&& object)
{ 
    return function<A, B>(std::forward<A>(object));
}

现在你可以致电:

function_wrapped<BType>(AInstance);

当然,只更改原始函数中参数的顺序会更简单。

第二个例子有点问题。

如果可以反转类型的依赖关系。要求B定义A的别名,您可以定义:

template<class B, B foo>
void function(typename B::A object)

并致电

function<decltype(BInstance), BInstance>(AInstance);

它不是很漂亮。

最简单的解决方案是使用运行时非类型参数,以便可以推导出所有类型。

template<class A, class B>
void function(A object, B foo)