c++ - 在编译时创建一个数组

标签 c++ templates

我有一个看起来像这样的类

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()并且不必在运行时查找类型,因为它应该在编译时知道它是什么类型的对象。

附言请不要建议虚函数,我知道它们是有效的解决方案,但我想知道这是否可行,因为我在编译时确实有所有类型信息。

最佳答案

我对你的问题的理解是这样的:

你想要某种表/数组,其中包含指向相应对象的对象指针和成员函数指针。稍后你想调用那个“对”,中间没有任何虚函数。

也许你可以从这个方法开始:

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 );
    }

}

关于c++ - 在编译时创建一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58056598/

相关文章:

c++ - 我可以从模板访问结构/类成员吗?

c++ - 此声明中使用了哪种类型的语法?

c++ - 作用域结束后重新分配

c++ - 重载解析在模板实例化点之后找到函数

c++ - 如何根据类型是整型还是浮点型来更改模板方法?

c++ - 如何防止模板化别名的隐式保值转换?

c++ - SWIG 和 C++ 共享库

c++ - time_t 和 tm 转换中的值错误

c++ - 如何使用非默认构造函数创建具有类范围类型范围的对象

c++ - 为什么 CRTP 实现和接口(interface)方法的命名不同?