使这个c ++代码通用

时间:2017-01-02 15:45:47

标签: c++ c++11 c++14 c++17

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

我从另一个问题获得了代码:C++17 construct array in stack using choosen constructor (same constructor parameter values for each array entry)

以下是基于此帖子的第一个响应的代码,由于某些原因,不能使用大于88的大小: http://ideone.com/WDlNwd

#include <iostream>
#include <utility>

struct A1 {
    A1() {
        printf("A1() called\n");
    }

    A1(std::size_t i) {
        printf("A1(%d) called\n", i);
    }

    A1(std::size_t i, std::size_t j) {
        printf("A1(%d, %d) called\n", i, j);
    }
};

struct A2 {
    A2(std::size_t i, std::size_t j, double k) {
        printf("A2(%d, %d, %lf) called\n", 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;
}

由于

1 个答案:

答案 0 :(得分:1)

答案基本上与the answer you got on the last one相同。唯一的区别是你必须传递零参数的特殊情况。并调整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... }... } {}
};