2011-03-02 103 views
1

我有一个模板函数,我希望返回T或变体的类型。我试图做如下,然而编译器抱怨它不能将'variant'转换为int(我用T = int使用这个函数)。返回特定类型的模板

我该如何实现这个功能,以便我可以返回变体或类型中包含的变体。

它是从一个向量结构中获得的。

template <typename T> 
T find_attribute(const std::string& attribute, bool isVariant = false) 
{ 
    std::vector<boost::shared_ptr<node> >::iterator nodes_iter = _request->begin(); 

    for (; nodes_iter != _request->end(); nodes_iter++) 
    { 
     size_t sz = (*nodes_iter)->attributes.size(); 
     std::vector<node::attrib>::iterator att_iter = (*nodes_iter)->attributes.begin(); 
     for (; att_iter != (*nodes_iter)->attributes.end(); att_iter++) 
     { 
      if (att_iter->key.compare(attribute) == 0) 
      { 
       if (isVariant) 
       { 
        return att_iter->value; //return variant 
       } 
       else 
       { 
        return boost::get<T>(att_iter->value); // return type inside variant as given by T. 
       } 
      } 
     } 
    } 
} 

回答

2

您可以为find_attribute<boost::variant>(const std::string& attribute)创建模板专门化,返回变体和正常版本attribute<T>(const std::string& attribute)

普通版本会做:

return boost::get<T>(find_attribute<variant>(attribute)); 

但reme​​ber该模板在编译时评价过!

如果find_attribute是一个成员函数,你可以使用这个MSVC编译器。

如果你不能做模板专门化,你可以命名不同的功能。

+0

我会避免写一个专门化,而是提供一个返回变体类型的非模板化版本。差异很小,但用户代码(请求变体类型时)会稍微更清晰(不需要在调用中添加'>',并且不需要以不同的方式命名该函数,因为重载解析规则将选择非模板版本。 – 2011-03-02 15:23:14

0

我应该如何实现这个,所以我可以只返回变体或类型包含的变种。

你不行。模板参数固定为编译时间,所以当你的程序发现它将不得不返回时,它已经很长时间了。

+0

所以对于变体我需要创建一个新的功能? – 2011-03-02 14:24:38

+0

在编译时,你将不得不有某种方式来说明你想从这个函数中获得什么。这可能是调用函数模板的不同实例的一个大开关,但要返回的类型必须编码到该开关中,并且在编译之后设置好。 – sbi 2011-03-02 14:47:06