Точно такая же функция, но возвращаемая структура данных будет отличаться - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть функция foo().Я хочу, чтобы он возвращал std::queue или потокобезопасный объект очереди.Какой лучший способ сделать это?Я рассмотрел шаблоны, но не уверен, что они соответствуют ситуации.Я мог бы скопировать и вставить все тело foo(), где одно будет std::queue foo1(), а другое - MyQueue foo2(), и просто изменить тип структуры данных.Но это было бы ужасно.

1 Ответ

0 голосов
/ 13 февраля 2019

Я думаю, что шаблоны функций хорошо подходят для этой ситуации

например

// Example program
#include <iostream>
#include <queue>

// Create a different type of queue
template <typename T>
struct another_queue : std::queue<T> {};

// Your function foo
template<typename T>
T foo()
{
    T q;
    for (auto v : {1, 2, 3, 4}) 
        q.push(v);
    return q;
}

int main()
{
    auto a = foo< std::queue<int> >();
    while (not a.empty())
    {
        std::cout << a.front() << "\n";
        a.pop();
    }

    auto b = foo< another_queue<int> >();
    while (not b.empty())
    {
        std::cout << b.front() << "\n";
        b.pop();
    }
}

...