【发布时间】:2017-05-21 04:00:14
【问题描述】:
有没有办法以通配符的方式用模板类声明朋友?
示例
我总是这样声明朋友:-
//B.h
template<class T1,class T2>class B{};
//C.h
class C{
template<class,class> friend class B;
};
但是,如果 B 模板参数发生更改,我将不得不更新 C,这通常是一个相距甚远的标题。
//B.h
template<int T3,class T1,class T2>class B{};
//C.h
class C{
template<int,class,class> friend class B; //<-- manually update here too
};
它会导致轻微的可维护性问题。 (对我来说,每周一次。)
问题
我可以这样做吗?
class C{
template<ANY...> friend class B;
};
这是不可能的吗?
我隐隐觉得这个问题可能是重复的,因为这可能是一个常见的问题。
但是,我找不到。
【问题讨论】:
-
你指的是variadic class template吗?
-
@codekaizer 是的。我也试过了。它仅在某些情况下有效。
-
@codeKaizer 仍然 OP 需要在相应的“C”类中用他需要的东西进行实例化
-
如果您必须经常更改 B 的模板参数,也许您应该考虑使用可变参数包对其进行模板化?这可能会更好地概括您的代码,并且可以通过
template <typename... Args> friend class B轻松地与它成为朋友,如果您想访问参数包中的特定类型,您可以使用std::tuple_element_t<0, std::tuple<Args...>>,可以将其设为别名以便于使用.template <int Index> using TypeAtIndex = std::tuple_element<Index, std::tuple<Args...>> -
@Curious 这是一个绝望的措施。我认为这对我来说不值得,但谢谢。
标签: c++ templates c++14 friend