C++ 为类模板的特定嵌套类实现非成员泛型函数
我有以下课程:C++ 为类模板的特定嵌套类实现非成员泛型函数,c++,templates,inner-classes,argument-dependent-lookup,name-lookup,C++,Templates,Inner Classes,Argument Dependent Lookup,Name Lookup,我有以下课程: template<int P> struct A { struct B { auto abs() const { return 1; } }; }; 它不会工作,因为ADL只在名称空间而不是类作用域中查找UPDATE:ADL在这里不起作用,因为abs是一种实例方法。然而,根据T.C.的回答,如果您将其作为朋友函数,它将正常工作,ADL将找到它 技术2(不起作用):在全局或命名空间范围中使用受约束的函数模板: template<i
template<int P>
struct A {
struct B {
auto abs() const { return 1; }
};
};
它不会工作,因为ADL只在名称空间而不是类作用域中查找UPDATE:ADL在这里不起作用,因为abs
是一种实例方法。然而,根据T.C.的回答,如果您将其作为朋友函数,它将正常工作,ADL将找到它
技术2(不起作用):在全局或命名空间范围中使用受约束的函数模板:
template<int P>
auto abs(typename A<P>::B const &e) { return e.abs(); }
template<typename T>
auto abs(T const &e) { return e.abs(); }
这很有效。然而,它是不受约束的。我想将此函数模板的实例化仅限于A
(对于P
之前未知)和其他类模板(对于多项式环和字段扩展)。问题是,如果P
处于非推断上下文中,我不确定如何使用SFINAE 这将起作用:
namespace impl {
template <int P>
struct B {
auto abs() const { return 1; }
};
template <int P>
auto abs(B<P>& b) {
return b.abs();
}
}
template <int P>
struct A {
using B = impl::B<P>;
friend B;
};
int main() {
A<3>::B inner;
abs(inner);
}
这里的优点是,此公共外观可用于多个类,并且不必是好友。template
template<int P>
struct A {
struct B {
auto abs() const { return 1; }
};
friend auto abs(B const &e) { return e.abs(); }
// ^^^^^^
};
结构A{
结构B{
auto abs()常量{return 1;}
};
friend auto abs(B const&e){return e.abs();}
// ^^^^^^
};
然后让ADL发挥它的魔力
(在
B
中定义它也很好。选择由您决定。)是否有办法保持声明的位置,但在类之外的另一个源文件中提供实现?@M.Alaggan No。这些函数实例化为一系列非模板函数,在类模板定义之外,没有办法拼写它。
namespace impl {
template <typename T>
struct facade : public T {};
template <typename T>
auto abs(facade<T>& b) { return b.abs(); }
}
template <int P>
struct A {
struct B_ {
auto abs() const { return 1; }
};
using B = impl::facade<B_ >;
};
int main() {
A<3>::B inner;
abs(inner);
}
template<int P>
struct A {
struct B {
auto abs() const { return 1; }
};
friend auto abs(B const &e) { return e.abs(); }
// ^^^^^^
};