Для чего нужно это предварительное объявление в классе шаблонов с переменным значением? - PullRequest
0 голосов
/ 04 июля 2018

Вот код для реализации шаблона декоратора в C ++. Он в основном принимает функцию и возвращает функтор. Этот код работает, но я хотел бы понять, почему нам нужна первая строка (то есть предварительное объявление). Если эта строка удалена, я получаю эту ошибку компиляции: ‘Decorator’ is not a class template

template <class> class Decorator;

template <class R, class... Args>
class Decorator<R(Args ...)>
{
    std::function<R(Args ...)> f_;
public:
    Decorator(std::function<R(Args ...)> f) : f_(f) {}
    R operator()(Args ... args)
    {
        auto res = f_(args...);
        std::cout << fmt::format("Calling the decorated function with res={}.\n", res);
        return res;
    }
};

1 Ответ

0 голосов
/ 04 июля 2018

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

Когда вы указываете аргумент шаблона с типом функции, применяется версия специализации, и он получает тип параметра (т.е. Args...) и тип возвращаемого значения (т.е. R) указанного типа функции.

...