Определить объединение параметризованного класса - PullRequest
0 голосов
/ 09 марта 2020

У меня есть этот простой класс:

template<int N>
struct Conn {
    int value; //let type be `int` for simplicity
};

Мне нужно определить класс "AnyConn" с произвольным параметром. Примерно так: (не работает)

typedef (template<int N> Conne) AnyConn;

или как это: (также не работает)

struct AnyConn {
    template<int N> Conne d;
};

.

Мне нужно спрятаться параметр N, сделать его «произвольным», так что Conn <0>, Conn <12> и Conn <33> могут быть упакованы как AnyConn. Как сделать это правильно и безошибочно?

1 Ответ

1 голос
/ 09 марта 2020

Вы можете использовать std::any, который может содержать любой тип копируемого объекта, для реализации чего-то, что может содержать только некоторые типы:

class AnyConn {
  public:
    template <int N>
    AnyConn(Conn<N> conn) : tag_(N), storage_(conn) {}

    int tag() const { return tag_; }

    template <int N> Conn<N>* get() { return std::any_cast<Conn<N>>(&storage_); }
    template <int N> const Conn<N>* get() const { return std::any_cast<Conn<N>>(&storage_); }

  private:
    int tag_;
    std::any storage_;
};

Возможно, вам придется изменить этот подход в зависимости от ваших спецификаций c требования, но в целом некоторая форма std::any сделает работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...