Сделать массив во время компиляции - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть класс, который выглядит следующим образом

class Foo 
{
public:
   template<class T> 
   A(T * ptr) { ptr_ = reinterpret_cast<void*>(ptr_);} 

   template<class T>
   T * get() { return reinterpret_cast<T*>(ptr_);}

private:
  void * ptr_;
};


Во время компиляции я точно знаю, какие элементы будут в моем массиве.Есть ли способ, которым я могу аннотировать этот класс так, чтобы массив указателей Foo знал, какой тип он должен получить?

В основном я хочу вызвать Foo[i]<T>->apply() и не должен искать тип во время выполнения, так как ондолжен знать во время компиляции, что это за объект.

PS Пожалуйста, не предлагайте виртуальные функции, я знаю, что они являются допустимым решением, но я хочу знать, возможно ли это, потому что у меня есть вся информация о типахво время компиляции.

1 Ответ

1 голос
/ 23 сентября 2019

Я понимаю ваш вопрос следующим образом:

Вы хотите иметь какую-то таблицу / массив, который содержит указатели на объекты и указатели на функции-члены для соответствующих объектов.Позже вы захотите назвать эти «пары» без каких-либо виртуальных функций между ними.

Может быть, вы можете начать с этого подхода:

struct A 
{
    void Foo() { std::cout << "A Foo" << std::endl; }
    void Bar() { std::cout << "A Bar" << std::endl; }
};

struct B 
{
    void Do() { std::cout << "B Do " << std::endl; }
    void Go() { std::cout << "B Go " << std::endl; }
};

    template < typename T, auto MEM_PTR >
void Call( void* obj)
{
    (((T*)obj)->*(MEM_PTR))();
}

using OBJ_FUNC_PAIR = std::pair< void* , void(*)(void*) >;

A a;
B b;

std::array< OBJ_FUNC_PAIR ,4 > arr
{
    {
        { (void*)&a, &Call<A, &A::Foo>},
            { (void*)&a, &Call<A, &A::Bar>},
            { (void*)&b, &Call<B, &B::Do > },
            { (void*)&b, &Call<B, &B::Go > }
    }
};

int main()
{
    for ( auto& pair: arr )
    {
        (*pair.second)( pair.first );
    }

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