Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在编译时生成数组_C++_Templates - Fatal编程技术网

C++ 在编译时生成数组

C++ 在编译时生成数组,c++,templates,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_; }; class-Foo {

我有一节课看起来像这样

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


class-Foo
{
公众:
样板
A(T*ptr){ptr_u=reinterpret_ucast(ptr_;)}
样板
T*get(){return reinterpret_cast(ptr_);}
私人:
void*ptr_;
};
在编译时,我确切地知道数组中将包含哪些元素。有没有一种方法可以注释这个类,使Foo指针数组知道它应该得到哪种类型

基本上,我想调用
Foo[I]->apply()
,而不必在运行时查找类型,因为它应该在编译时知道它是什么类型的对象


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

我对您的问题的理解如下:

您希望有某种类型的表/数组,其中包含指向相应对象的对象指针和成员函数指针。稍后,您希望调用“pairs”,而不在两者之间使用任何虚拟函数

也许您可以从以下方法开始:

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

}
结构A {
空的FULL(){STD::COUT,因为C++没有可变长度数组,所有数组都被创建(并且它们的大小已知)在编译时。模板也是纯编译时的东西,编译时总是知道
T
的类型。顺便说一句,你的构造函数和
get
函数允许你很容易地打破严格的别名。对于类型擦除,你可以使用其他构造(如
std::variant
std::any
)是的,但是在运行时我仍然需要使用T作为正确的类型,有没有一种方法可以调用get而不需要该类型,因为在编译时一切都是已知的?将整个类作为模板?通过使用
void*
可以显式删除类型信息。请详细说明需要解决的实际问题?您为什么需要这样的东西?如果您将指针声明为
T*\u ptr
,那么它们的类型是正确的(并且您不需要
重新解释\u cast
)。对我来说,这似乎是您问题的明显答案,我遗漏了什么吗?如何声明模板参数“auto”@ AAMUPUTA:如果你不能使用C++ 17,你也可以用“Actuple”函数来声明模板,而不是用“成员函数指针”参数。但是你的问题是标记C++,我们有2019: