Получить список значений переменной-члена для параметров шаблона - PullRequest
0 голосов
/ 11 мая 2018

Вот пример, показывающий, что я по сути пытаюсь сделать

// Example program
#include <iostream>
#include <vector>

struct base_type
{
    static const uint64_t type_id = 0x0;
};

struct A : public base_type
{
    static const uint64_t type_id = 0xA;
};

struct B : public base_type
{
    static const uint64_t type_id = 0xB;
};

struct C : public base_type
{
    static const uint64_t type_id = 0xC;
};


template <class... Args>
struct processor
{
    void process(Args... args);

    // NEED HELP WITH HOW THIS WOULD WORK
    // Essentially I want a fucntion that can extract
    // the type_id of each of the template parameters
    std::vector<uint64_t> get_type_ids()
    {
        // What should go in here?
    }
};

int main()
{
    processor<A, B> my_processor;
    B b;
    C c;
    // Here's the part that I am stuck on
    // THIS IS PSEUDOCODE
    if (b.type_id in my_processor.get_type_ids() and c.type_id in my_processor.get_type_ids())
    {
        my_processor.process(b, c);
    }
    else
    {
        std::cout << "One of the arguments to process was not the correct type" << std::endl;
    }
}

И в этом примере это выведет сообщение об ошибке.Есть какой-либо способ сделать это?Причина, по которой я сталкиваюсь с этой проблемой, заключается в том, что я получаю несколько base_type объектов, которые передаются process, но мне нужно заранее проверить, можно ли безопасно преобразовать base_type в производный тип.На самом деле все уже имеет type_id, поэтому я надеюсь, что это может спасти меня.

1 Ответ

0 голосов
/ 11 мая 2018

Вот как бы я это сделал:

вместо использования скалярного типа для идентификатора типа, например так:

static const uint64_t type_id = 0x0;

Я бы создал выделенный тип с конструктором :

static const my_meta_type type_id;

my_meta_type A::type_id{0x00};

Где my_meta_type будет выглядеть примерно так:

class my_meta_type {
  static std::vector<my_meta_type const*>& registered_types(); //Meyer's singleton
  uint64_t id_;
public:
  my_meta_type(uint64_t id) 
    : id_(id) {
    registered_types().emplace_back(this);
  }
};

std::vector<my_meta_type*>& my_meta_type::registered_types() {
  static std::vector<my_meta_type const*> instance;
  return instance;
}

Что это будет делать, так это то, что во время инициализации будут выполняться конструкторы my_meta_type, помещая экземпляры указателя в vector<my_meta_type*>. Поскольку все это происходит во время инициализации, мы должны убедиться, что порядок инициализации не вызывает у нас проблем, поэтому мы используем синглтон Мейера для разрешения потенциальных конфликтов.

Оттуда все, что вам нужно сделать, это получить идентификаторы из вектора во время выполнения программы.

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