调用boost:上的函数:变量,无论类型如何
Call function on boost::variant regardless of type?
我有一个类,它有一个模板:
template<class T = int> class slider;
该类有一个void Process(void)
方法,所以,我认为它应该是该类型的可调用regarless,返回值为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
,几乎可以肯定您做了错误的事情。访问变体元素的正确方法是使用访问者,而不是get
。
在您的情况下,访问者应该很简单:
struct ProcessVisitor : public boost::static_visitor<>
{
template<typename T> void operator() (const T& t) const {t->Process();}
};
只需使用apply_visitor
即可。如果变量包含一个可以与operator->
一起使用的类型,并且该函数的返回值可以调用Process
,那么它会。
(未测试代码!(
struct CallProcess : static_visitor<>
{
template <class T>
void operator()(const T &t) const
{
t->Process();
}
};
for(auto i = Sliders.begin(); i != Sliders.end(); ++i)
{
boost::apply_visitor(CallProcess(), i->second);
}
不,一点也不。你必须访问并处理每种类型的案件。与你的交换机破解相比,对访客这样做要好得多。
boost::variant
无法知道variant
中的所有类型都有任何共同点。事实上,由于编译器为所使用的每个模板专用化生成一个不同的类,因此对于boost::variant
中的每个类型,需要使用的Process()
函数的地址是不同的。为了解决这个问题,您可以放弃variant
,使用共享一个公共基类的虚拟函数和多态类。
相关文章:
- 从模板创建通用打印函数,以打印基元数据类型变量的值
- 指针数据类型变量如何包含对象?
- 将 static_cast<int>(-15) 分配给静态常量字符类型变量
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- 如何为结构类型变量赋值
- 如何将字符类型变量附加到字符串中?
- 共享或私有 openmp 代码中的结构化类型变量
- 有没有办法在 c++ 中制作类型变量?
- 从其他类声明类类型变量会给出 C2143 错误(在"*"之前缺少";")
- 如何检查类中定义的枚举类型变量是否被分配给?
- 将子类实例保存在父类型变量中并通过父变量使用 Child 函数?
- 是否可以在没有结构的情况下创建新的类型变量?
- 为什么类型变量;不调用默认 CTR
- 如何使用CIN将输入整数值获取到char类型变量中
- 如何为 char** 类型变量提供适当的值,以便将其分配给字符串变量
- 在C++标准中哪里说必须初始化 const 内置类型变量的定义
- 为什么可以将其他类型变量用作C 中常量参考参数参数的参数
- Eclipse CDT 打开声明的自动类型变量
- 如何计算长长类型变量中的位数
- 将自动类型变量初始化为零.这种类型安全吗?