【问题标题】:use boost::variant to call template class functions使用 boost::variant 调用模板类函数
【发布时间】:2017-10-11 11:00:42
【问题描述】:

我有一个模板类

template <T>
class class1
{
    template< typename T1, typename T2>
   void func1 ()
   {  // do somthing }

   template< typename T1>
   void func2 ()
    { //do something }                                                     
};

class class2
{
     // Have three objects based on template type
     public:
     class2 ()
     {
         if (case1)
             obj = class1<type1> ;
         else if (case2) 
            obj = class1<type2>;
         else if (case3)
            obj = class1<type3>;
      }

       void fun1 ()
       { obj->func1(); }  //calling class1 function based on template type

        void func2 ()
       { obj->func2(); }  //

      typedef boost::variant <class1<Type1>, class1 <type2>, class1 <type3>> obj1;
      obj1 obj;

 };

如何使用 boost::variant 调用 class1 函数。无法创建虚拟类,因为无法创建模板化虚拟函数,我需要根据模板类型创建单个对象以避免每个函数中出现 if else。

【问题讨论】:

  • func1/func2 是模板是否正常?如果是,你想用哪种类型称呼他们?
  • 是的 func1/func2 都是模板,它取决于运行时哪个函数可以基于传递给主函数的参数
  • 模板类型可以是任何东西,int、double、string 或基于运行时传递的参数的用户定义类
  • 在哪些情况下您会调用 class1&lt;type1&gt;::func1&lt;int, char&gt;()class1&lt;type1&gt;::func1&lt;void, double&gt;() ?您有一个变体,它指示调用函数的实例,但您没有提供调用正确实例的信息。
  • 上述代码只是一个示例,实际代码更多,所以我只是粘贴了我面临问题的部分的示例。

标签: c++ templates boost-variant


【解决方案1】:

使用任何类型的访问者(模板operator()

boost::apply_visitor([](auto& x){ x.func1(); }, obj);

【讨论】:

  • 目前 class1&lt;T&gt;::func1 是模板(具有不可推导的类型),因此您必须提供它们(但从 OP 中不清楚它应该是什么:-/)
  • class1::func1 是模板(具有不可推导的类型),类型可以是任何类型,也可以是用户定义的类。
  • @vittorio:我需要重载 operator() 吗?如果是,我需要在那里添加什么。我想从 class2 调用 func1 和 func2。没有别的
  • @Dodez:不,模板operator()是由lambda表达式为你生成的。
  • @VittorioRomeo in class2 void func1() { boost::apply_visitor([](auto& x){ x.func1(); }, obj); } 在编辑器中编译之前给出 { } 错误
猜你喜欢
  • 2022-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
相关资源
最近更新 更多