使此 C++ 代码通用

Make this c++ code generic

本文关键字:代码 C++ 使此      更新时间:2023-10-16

我正在尝试使代码片段通用,但我很难做到这一点,因为我不完全了解代码中使用的技术是如何工作的。

我从另一个问题中得到了代码:C++17 使用选择构造函数在堆栈中构造数组(每个数组条目的构造函数参数值相同)

这是基于这篇文章的第一个响应的代码,由于某种原因,它不适用于 88 以上的大小:http://ideone.com/WDlNwd

#include <iostream>
#include <utility>
struct A1 {
    A1() {
        printf("A1() calledn");
    }
    A1(std::size_t i) {
        printf("A1(%d) calledn", i);
    }
    A1(std::size_t i, std::size_t j) {
        printf("A1(%d, %d) calledn", i, j);
    }
};
struct A2 {
    A2(std::size_t i, std::size_t j, double k) {
        printf("A2(%d, %d, %lf) calledn", i, j, k);
    }
};
template <class T, size_t Size>
class B {
    template<typename Arg1, typename ...Args, size_t... Is>
    B(std::index_sequence<Is...>, const Arg1 &arg1, const Args &...args) :
    tab{ {(void(Is), arg1), args... }... }
    {}
    public:
    T tab[Size];
    B() = default;
    template<typename ...Args>
    B(const Args &...args)
        : B(std::make_index_sequence<Size>(), args...) {}
};
int main() {
    static constexpr size_t Size = 100;
    B<A1, Size> b1(11, 17);
    B<A1, Size> b1a(11);
    B<A1, Size> b1b;
    B<A2, Size> b2(11, 17, 1.2);
    return 0;
}

谢谢

答案与上一个答案基本相同。唯一的区别是您必须在特殊情况下传递零参数。并调整index_sequence参数的顺序:

struct B {
    A tab[100];
    //Note: feel free to use SFINAE to make this go away
    //if `A` is not default-constructible.
    B() = default;
    template<typename ...Args>
    B(const Args &...args)
        : B(std::make_index_sequence<100>(), args...) {}
private:
    template<typename Arg1, typename ...Args, size_t... Is>
    B(std::index_sequence<Is...>, const Arg1 &arg1, const Args &...args)
        : tab{ {(void(Is), arg1), args... }... } {}
};