从具有可变数量的模板参数的模板化类中的特定基础获取结果

时间:2014-06-23 17:46:22

标签: c++ templates function-template

我正在尝试实现如下的模板化类。

   struct Ciccio2 : public T1, public T2, public T3, public T4
   {
     template<typename TR>
     int get(const string& s) const
     {
       return TR::operator()(s);
     }
   };

所有模板化参数都类似于以下示例类

   struct AA{ 
     int operator()(const string& s) { return 1;}
   };

我也尝试使用全局提取器函数,但是当我使用g ++下面的模板函数时,我会发现构建错误

   template<class TA, class T1, class T2, class T3, class T4>
   int extract(const Ciccio2<T1,T2,T3,T4>& obj, const string& s)
   {
     return obj.get<TA>(s);
   }

下面的代码并不夸张说

expected primary expression before > token

我想要实现的是正确的吗?

2 个答案:

答案 0 :(得分:1)

由于obj是依赖于类型的表达式,因此编译器不会使用名称查找来确定obj.get是对象,函数,类型还是模板。除非您强制执行其他操作,否则编译器会假定它是语法分析的对象或函数。接下来它会看到<小于运算符(而不是<开始模板参数列表),之后很快就会感到困惑。你需要:

return obj.template get<TA>(s);

另见问题Where and why do I have to put the template and typename keywords?

答案 1 :(得分:0)

除非TRT1T2T3T4之一,否则该行:

   return TR::operator()(s);

应该是:

   return TR().operator()(s);

   return TR()(s);

由于operator()不能是静态成员函数。