Использование шаблона для возвращаемого значения. как справиться с возвращением пустоты? - PullRequest
16 голосов
/ 22 июля 2010

У меня есть структура для хранения функции обратного вызова, подобная этой:

template<class T>
struct CommandGlobal : CommandBase
{
    typedef boost::function<T ()> Command;
    Command comm;

    virtual T Execute() const
    {
        if(comm)
            return comm();
        return NULL;
    }
};

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

Как лучше всего решить эту проблему?

Спасибо!

Ответы [ 2 ]

13 голосов
/ 22 июля 2010

Этот ответ основан на этом забавном факте : в функции, возвращающей void, вы можете вернуть любое выражение, тип которого не имеет значения.

Таким образом, простое решение:

virtual T Execute() const
{
    if (comm) 
        return comm();
    else
        return static_cast<T>(NULL);
}

Когда T = void, последний оператор возврата эквивалентен return;.


Однако я считаю, что это плохой дизайн.Имеет ли значение NULL для каждый T?Я так не думаю.Я бы бросил исключение:

virtual T Execute() const
{
    if (comm)
        return comm();
    else
        throw std::runtime_error("No function!")
}

Однако, это делается автоматически с помощью Boost , поэтому ваш код становится намного чище:

virtual T Execute() const
{
    return comm();
}

Тогда вы можетедобавить дополнительные функции, такие как:

bool empty(void) const
{
    return !comm; // or return comm.empty() if you're the explicit type
}

, чтобы пользователь мог проверить, может ли он быть вызван до вызова.Конечно, на данный момент, если у вашего класса нет дополнительных функций, которые вы исключили ради вопроса, я не вижу причин, чтобы просто не использовать boost::function во-первых.

4 голосов
/ 22 июля 2010

Если это просто оператор return, это должно сработать:

virtual T Execute() const
{
    if(comm)
        return comm();
    return T();
}

Если есть что-то еще, специализируйте шаблон для void.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...