шаблон для возврата определенного типа - PullRequest
1 голос
/ 02 марта 2011

У меня есть шаблонная функция, которую я хочу вернуть либо тип T, либо вариант. Я попытался сделать следующее, однако компилятор жалуется, что не может преобразовать 'option' в 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 ]

2 голосов
/ 02 марта 2011

Вы можете создать шаблон специализации для 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 .

Если вы не можете специализироваться на шаблонах, вы можете назвать функции по-разному.

0 голосов
/ 02 марта 2011

Как мне это реализовать, чтобы я мог либо просто вернуть вариант, либо тип, содержащийся в варианте.

Ты не можешь. Параметры шаблона имеют фиксированное значение время компиляции , поэтому, когда ваша программа узнает, что ей нужно будет вернуть, все уже давно установлено в камне.

...