这不起作用,因为
Entity<Args>::InnerEntity
是非推断上下文。意思是说
ArgsA...
和
ArgsAInner...
无法推导,其他参数也是如此。这是因为在编译器能够
Args
,它必须知道什么类型
InnerEntity
是的成员,但要知道
那个
,必须推断
阿尔茨海默病
.
您可以将此函数作为朋友函数模板放入
Entity<Args...>
并且只要两者都是同一模板的成员,就可以使其工作。但上次我检查时,gcc没有找到类模板中定义的友元函数。
template<typename ...Args>
class Entity {
template<typename ...ArgsInner>
class InnerEntity {
};
template<typename ...ArgsAInner, typename... ArgsBInner>
> friend auto my_func(
InnerEntity<ArgsAInner...> A
, InnerEntity<ArgsBInner...> B
) -> tuple<decltype(A), decltype(B)> {
return make_tuple(A, B);
}
};
您还可以在中声明一些成员typedef
内在性
它指定了外部类的类型,并
my_func
从这个角度来说,这样sfinae就可以为非成员进行分类。
template<typename ...Args>
class Entity {
template<typename ...ArgsInner>
class InnerEntity {
typedef Entity outer_entity;
};
};
template<typename A, typename B, typename Result>
struct require_entity { };
template<typename ...ArgsA, typename ...ArgsB, typename Result>
struct require_entity<Entity<ArgsA...>, Entity<ArgsB...>> {
typedef Result type;
};
template<template<typename...> class AInner, template<typename...> class BInner,
typename ...ArgsAInner, typename ...ArgsBInner>
> auto my_func(
AInner<ArgsAInner...> A
, BInner<ArgsBInner...> B
) -> typename require_entity<
typename AInner<ArgsAInner...>::outer_entity,
typename BInner<ArgsBInner...>::outer_entity,
tuple<decltype(A), decltype(B)>>::type
{
return make_tuple(A, B);
}
当然你不需要那个
template<typename...> class AInner
如果您不需要访问
ArgsAInner
类型,如上所述
我的功能
. 在这种情况下,你最好接受
typename AInner
而且写得少。斯芬纳仍将确保只接受正确的事情。