1

我有一个模板函数,我希望返回 T 的类型或变体。我尝试执行以下操作,但是编译器抱怨它无法将“变体”转换为 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.
                }
            }
        }
    }
}
4

2 回答 2

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编译器一起使用。

如果您不能进行模板专业化,您可以将函数命名为不同的名称。

于 2011-03-02T14:26:28.480 回答
0

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

你不能。模板参数在编译时是固定的,所以当你的程序发现它必须返回什么时,它早就一成不变了。

于 2011-03-02T14:20:59.287 回答