模板返回特定类型

时间:2011-03-02 14:18:39

标签: c++ templates return variant

我有一个模板函数,我想返回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 个答案:

答案 0 :(得分:2)

您可以为find_attribute<boost::variant>(const std::string& attribute)创建一个返回变体和普通版attribute<T>(const std::string& attribute)的模板专精。

正常版本可以:

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

但请记住,该模板在编译时进行评估!

如果find_attribute是成员函数,则可以将 msvc 编译器一起使用。

如果您不能进行模板专业化,则可以将功能命名为不同。

答案 1 :(得分:0)

  

我应该如何实现这一点,以便我可以只返回变体或类型包含在变体中。

你做不到。模板参数在 编译时 中得到修复,因此当您的程序找到它必须返回的内容时,它就会被设置为石头。