gpt4 book ai didi

c++ - 如何在类级别存储从构造函数收集的类型信息以用于转换

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:43 24 4
gpt4 key购买 nike

我正在尝试编写一个无需模板参数即可存储和使用类型信息的类。

我想写这样的东西:

class Example
{
public:
template<typename T>
Example(T* ptr)
: ptr(ptr)
{
// typedef T EnclosedType; I want this be a avaialable at the class level.
}

void operator()()
{
if(ptr == NULL)
return;

(*(EnclosedType*)ptr)(); // so i can cast the pointer and call the () operator if the class has one.
}

private:
void* ptr;
}

我不是在问如何编写 is_functor() 类。

我想知道如何在构造函数中获取类型信息并将其存储在类级别。如果这不可能,我们将不胜感激。

最佳答案

我认为这是一个很好且有效的问题,但是,除了在类级别使用模板参数之外,没有通用的解决方案。您在问题中尝试实现的目标 - 使用 typedef在函数内部然后在整个类中访问它——这是不可能的。

类型删除

只有当您对构造函数参数施加某些限制时,才有一些替代方案。在这方面,这里有一个类型删除的例子,其中 operator()某些给定对象的存储在 std::function<void()> 中变量。

struct A
{
template<typename T>
A(T const& t) : f (std::bind(&T::operator(), t)) {}

void operator()() const
{
f();
}

std::function<void()> f;
};

struct B
{
void operator()() const
{
std::cout<<"hello"<<std::endl;
}
};

int main()
{
A(B{}).operator()(); //prints "hello"
}

DEMO

但是请注意,这种方法背后的假设:假设所有传递的对象都具有给定签名的运算符(此处为 void operator() ),该运算符存储在 std::function<void()> 中。 (关于存储成员函数,请参阅 here)。

继承

从某种意义上说,类型删除就像“没有基类的继承”——可以使用虚拟括号运算符为所有构造函数参数类使用一个公共(public)基类,然后将基类指针传递给你的构造函数.

struct A_parameter_base
{
void operator()() const = 0;
};

struct B : public A_parameter_base
{
void operator()() const { std::cout<<"hello"<<std::endl; }
};

struct A
{
A(std::shared_ptr<A_parameter_base> _p) : p(_p) {}

void operator()()
{
p->operator();
}

std::shared_ptr<A_parameter_base> p;
}

这与您问题中的代码类似,只是它不使用 void。 -pointer 而是指向特定基类的指针。

类型删除和继承这两种方法在它们的应用中是相似的,但是类型删除可能更方便,因为人们摆脱了一个公共(public)基类。然而,继承方法还有一个好处,就是可以通过多次分派(dispatch)恢复原始对象

这也显示了这两种方法的局限性。如果您的接线员不是 void但是会返回一些未知的可变类型,你不能使用上面的方法,而必须使用模板。并行继承是:你不能有虚函数模板。

关于c++ - 如何在类级别存储从构造函数收集的类型信息以用于转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30606561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com