我有一个模板函数,我想返回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.
}
}
}
}
}
答案 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)
我应该如何实现这一点,以便我可以只返回变体或类型包含在变体中。
你做不到。模板参数在 编译时 中得到修复,因此当您的程序找到它必须返回的内容时,它就会被设置为石头。