通过参数推导多参数模板中的第一个模板参数
Deduce first template parameter in multiple parameter template by parameter
首先是我的问题,然后是对我正在尝试做的事情的解释,因为我可能会错误地处理问题。
是否可以在指定其他参数的同时从参数中推导出多参数模板中的第一个模板参数。
示例:
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);
区别在于第二个模板参数取决于第一个模板参数的具体类型,因此我无法切换模板参数。
现在描述我正在尝试做的事情:
我目前正在尝试创建一个模板通用仿函数 class,它可以采用自由函数或成员函数并将其包装到仿函数中。
我已经成功地完成了我打算做的事情,但现在我想让一切都变得更加用户友好。目前创建仿函数的模板函数如下所示:
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 始终被视为第一个模板参数。
不可以,您只能按照声明的顺序指定模板参数。因此,您可以指定第一个并推导出第二个,但不能反过来。
您可以为模板编写一个包装器:
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);
不太好看
最简单的解决方案是使用运行时 non-type 参数,以便可以推导出所有类型。
template<class A, class B>
void function(A object, B foo)
首先是我的问题,然后是对我正在尝试做的事情的解释,因为我可能会错误地处理问题。
是否可以在指定其他参数的同时从参数中推导出多参数模板中的第一个模板参数。
示例:
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);
区别在于第二个模板参数取决于第一个模板参数的具体类型,因此我无法切换模板参数。
现在描述我正在尝试做的事情:
我目前正在尝试创建一个模板通用仿函数 class,它可以采用自由函数或成员函数并将其包装到仿函数中。
我已经成功地完成了我打算做的事情,但现在我想让一切都变得更加用户友好。目前创建仿函数的模板函数如下所示:
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 始终被视为第一个模板参数。
不可以,您只能按照声明的顺序指定模板参数。因此,您可以指定第一个并推导出第二个,但不能反过来。
您可以为模板编写一个包装器:
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);
不太好看
最简单的解决方案是使用运行时 non-type 参数,以便可以推导出所有类型。
template<class A, class B>
void function(A object, B foo)