gpt4 book ai didi

c++ - 在 boost::variant 上调用函数而不考虑类型?

转载 作者:太空宇宙 更新时间:2023-11-04 14:41:48 24 4
gpt4 key购买 nike

我有一个有模板的类:

 template<class T = int> class slider;

该类有一个 void Process(void) 方法,因此,我认为无论类型如何,它都应该是可调用的,返回值为 void 且没有参数。

至于现在我有这段代码来调用我应用程序中每一帧的进程:

//class menu:
typedef boost::variant<std::shared_ptr<slider<int>>,std::shared_ptr<slider<float>>,std::shared_ptr<slider<double>>,std::shared_ptr<slider<char>>> slider_type;
std::map<std::string,slider_type> Sliders;
//buttons ... etc ...
void Process()
{
if(!Sliders.empty())
{
for(auto i = Sliders.begin(); i != Sliders.end(); ++i)
{
switch(i->second.which())
{
case 0://slider<int>
{
boost::get<std::shared_ptr<slider<int>>>(i->second)->Process();
break;
}
case 1://slider<float>
{
boost::get<std::shared_ptr<slider<float>>>(i->second)->Process();
break;
}
//.....
}
}
}
}

是否可以像下面的例子那样执行 Process() 函数?

    for(auto i = Sliders.begin(); i != Sliders.end(); ++i)
{
switch(i->second.which())
{
boost::get<???Any???>(i->second)->Process();
}
}

如果是,怎么办?

最佳答案

这样的函数会返回什么?您不能在运行时 更改函数的类型。变体的要点在于它的内容是在运行时确定的。

它唯一可以返回的是 boost::any。这实际上只是将一种未知数换成另一种(请注意,当您不知道它包含什么时,很多更难处理的未知数)。但是如果你想见到这样的访客:

struct convert_to_any : public boost::static_visitor<boost::any>
{
template<typename T> boost::any operator() (const T& t) {return t;}
};

对此使用apply_visitor,您将得到一个any。尽管我看不出这有什么用。


无论如何,如果您在 variant 上使用 get,您几乎可以肯定做错了事。访问变体元素的正确方法是使用 visitor,而不是使用 get

在您的情况下,访问者应该很简单:

struct ProcessVisitor : public boost::static_visitor<>
{
template<typename T> void operator() (const T& t) const {t->Process();}
};

只需在上面使用apply_visitor。如果变体包含可以与 operator-> 一起使用的类型,并且该函数的返回值可以调用 Process,那么它会。

关于c++ - 在 boost::variant 上调用函数而不考虑类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16600075/

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