C++ class 需要对另一个 class 的对象有可变数量的引用
C++ class needs to have variable number of references to objects of another class
假设我有一个 C++ class (class A),它需要引用另一个 class (class B) 的可变数量的实例。所需的引用数量在编译时已知。至于用法,我希望能够在编译时将对 B 类型对象的引用传递给 A 类型对象。
我一直在考虑如何解决这个问题,我的一个想法是使用可变参数模板构造。我对可变参数模板不是很熟悉,所以在研究该主题之前,我想知道它是否适合我的问题。
引用可能应该是(智能)指针或 std::ref
对象。为了简洁起见,我使用常规指针。根据您希望将它们传递给构造函数的具体方式,您可以这样做:
template <std::size_t nobj> class A
{
std::array<B*, nobj> bs;
public:
// 1 Pass as separate arguments
template <typename ... T>
A(T* ... t) : bs{t...} {
// check that the number of arguments is ok
static_assert(nobj == sizeof ...(T));
}
// 2 Pass as an array
A(const std::array<B*, nobj>& bs) : bs(bs) {}
};
// deduce the template parameter from the number of arguments
template<typename ... T>
A(T... t) -> A<sizeof ... (T)>;
所以你可以像这样进行初始化:
A a{&b1, &b2, &b3};
像这样:
std::array<B, 3> bs{&b1, &b2, &b3};
A a(bs);
假设我有一个 C++ class (class A),它需要引用另一个 class (class B) 的可变数量的实例。所需的引用数量在编译时已知。至于用法,我希望能够在编译时将对 B 类型对象的引用传递给 A 类型对象。
我一直在考虑如何解决这个问题,我的一个想法是使用可变参数模板构造。我对可变参数模板不是很熟悉,所以在研究该主题之前,我想知道它是否适合我的问题。
引用可能应该是(智能)指针或 std::ref
对象。为了简洁起见,我使用常规指针。根据您希望将它们传递给构造函数的具体方式,您可以这样做:
template <std::size_t nobj> class A
{
std::array<B*, nobj> bs;
public:
// 1 Pass as separate arguments
template <typename ... T>
A(T* ... t) : bs{t...} {
// check that the number of arguments is ok
static_assert(nobj == sizeof ...(T));
}
// 2 Pass as an array
A(const std::array<B*, nobj>& bs) : bs(bs) {}
};
// deduce the template parameter from the number of arguments
template<typename ... T>
A(T... t) -> A<sizeof ... (T)>;
所以你可以像这样进行初始化:
A a{&b1, &b2, &b3};
像这样:
std::array<B, 3> bs{&b1, &b2, &b3};
A a(bs);