Информация об изменениях

Сообщение Re: количество аргументов из шаблона от 20.11.2019 19:38

Изменено 20.11.2019 19:46 rg45

Re: количество аргументов из шаблона
Здравствуйте, Dair, Вы писали:

D>Как бы такое написать


  пример
D>
D>template <typename Ret, typename Arg, size_t N>
D>class Foo {
D>public:
D>    virtual ~Foo() = default;
D>    virtual Ret bar( вот тут непонятно что написать, но с участием Arg ) = 0;
D>};
D>


D>Чтобы пользоваться этим примерно так:


D>
D>class S3 : public Foo<void, int, 3> {
D>public:
D>    void bar(int a1, int a2, int a3) override {
D>    }
D>};

D>class S5 : public Foo<void, int, 5> {
D>public:
D>    void bar(int a1, int a2, int a3, int a4, int a5) override {
D>    }
D>};
D>


Ну, навскидку, как-то так:

http://coliru.stacked-crooked.com/a/07f86ca7dc51c6cc

template <typename, typename, typename> class FooBase;
template <typename Ret, typename Arg, size_t...I>
class FooBase<Ret, Arg, std::index_sequence<I...>> {
    template <size_t>
    using Param = Arg;
public:
    virtual ~FooBase() = default;
    virtual Ret bar(Param<I>...) = 0;
};

template <typename Ret, typename Arg, size_t N>
class Foo : public FooBase<Ret, Arg, std::make_index_sequence<N>> {
};
Re: количество аргументов из шаблона
Здравствуйте, Dair, Вы писали:

D>Как бы такое написать


  пример
D>
D>template <typename Ret, typename Arg, size_t N>
D>class Foo {
D>public:
D>    virtual ~Foo() = default;
D>    virtual Ret bar( вот тут непонятно что написать, но с участием Arg ) = 0;
D>};
D>


D>Чтобы пользоваться этим примерно так:


D>
D>class S3 : public Foo<void, int, 3> {
D>public:
D>    void bar(int a1, int a2, int a3) override {
D>    }
D>};

D>class S5 : public Foo<void, int, 5> {
D>public:
D>    void bar(int a1, int a2, int a3, int a4, int a5) override {
D>    }
D>};
D>


Ну, навскидку, как-то так:

http://coliru.stacked-crooked.com/a/24a17eae8da7a765

template <typename, typename, typename> class Foo_;

template <typename Ret, typename Arg, size_t...I>
class Foo_<Ret, Arg, std::index_sequence<I...>> {
    template <size_t> using Param = Arg;
public:
    virtual ~Foo_() = default;
    virtual Ret bar(Param<I>...) = 0;
};

template <typename Ret, typename Arg, size_t N>
using Foo = Foo_<Ret, Arg, std::make_index_sequence<N>>;