c++ Variadic模板类

l3zydbqr  于 2023-08-09  发布在  其他
关注(0)|答案(2)|浏览(105)

在C++中有没有一种方法可以创建一个模板类,它可以在构造函数中接受任意数量的参数,并且可以在需要时获取这些参数?
范例:

#include <string>

template<size_t Size, typename... Types>
class Container
{
public:
    Container(Types... args) 
    {
        // add checks to see if Size = no args
    }

    void get(Types&... args) 
    {
        // getter method
    }
};

int main() 
{
    Container<3, int, double, std::string> container(10, 2.5, "smth");
    int a{};
    double b{};
    std::string c {};
    container.get(a, b, c);
    // expect a = 10, b = 2.5, c = "smth"
    return 0;
}

字符串

b09cbbtk

b09cbbtk1#

是的,您的问题的解决方案已经以std::tuple的形式存在:

// note: size_t parameter isn't needed, we can simply get the size using
//       sizeof...(Types)
template<typename... Types>
class Container {
public:
    std::tuple<Types...> stuff;

    // note: in practice, this should use forwarding references and
    //       std::forward instead of taking everything by value
    Container(Types... args) : stuff(args...) {}

    void get(Types&... args) {
        // std::tie creates a tuple of references, letting us
        // assign all members at once
        std::tie(args...) = stuff;
    }
};

字符串
你可以实现一个 Package std::tuple的容器,但它并没有真正提供任何std::tuple还没有提供的实用程序,所以我们可以直接使用它:

int main() {
    std::tuple<int, double, std::string> container(10, 2.5, "smth");

    // not so good: decompose using three variables and std::tie
    int a {};
    double b {};
    std::string c {};
    std::tie(a, b, c) = container;

    // better: use structured bindings (C++17)
    auto [aa, bb, cc] = container;
}


请记住,在泛型编程之外,您最好创建自己的struct,为类型和成员使用有意义的名称。

// aggregate type
struct Container {
    int a;
    double b;
    std::string c;
};

int main() {
    Container container{10, 2.5, "smth"};
    // structured bindings also work for aggregate types (C++17)
    auto [a, b, c] = container;
}

ru9i0ody

ru9i0ody2#

在C++中有没有一种方法可以创建一个模板类,它可以在构造函数中接受任意数量的参数,并且可以在需要时获取这些参数?
是的,在这里简单地使用std::tuple。是否应该将其 Package 到类模板中,取决于进一步的需求。

#include <tuple> // std::tuple

auto container{ std::make_tuple(10, 2.5, "smth"s) };
// Structured bindings since C++17
auto  [a, b, c] = std::tuple<int, double, std::string>(container);

字符串

*See a live demo in godbolt.org

相关问题