Функция шаблона, принимающая класс шаблона - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть несколько классов-агрегаторов, которые должны агрегироваться по списку переменных, например:

template<class T>
class Min{
public:
    T val=0;
    void aggregate(T val_){
        if(val_ < val){
            val = val_;
        }
};

Теперь я хочу иметь функцию слияния, которая объединяет два агрегатора.Было бы принято 2 агрегатора, например Min и их тип.

template<class Agg, class T>
Agg<T> merge(Agg<T> agg1, Agg<T> agg2);

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

template <> // specialization for Agg
template <class T> // abstraction for Agg's type
Min<T> merge<Min<T>>(Min<T> agg1, Min<T> agg2){...}

генерирует ошибку

error: too many template-parameter-lists
Min<T> merge<Min<T>>(Min<T> agg1, Min<T> agg2){...}
       ^~~~~~~~~~~~~

Какой тогда правильный синтаксис?

1 Ответ

0 голосов
/ 30 декабря 2018

Обратите внимание, что здесь вы должны использовать синтаксис шаблона шаблона, в отличие от вашего исходного кода.

template<template<class> class Agg, class T>
Agg<T> merge(Agg<T> agg1, Agg<T> agg2);

Но это на самом деле не нужно, учитывая остальную часть этого ответа.

Что касаетсяОстальная часть вопроса, частичная специализация разрешена для шаблонных классов, но не для шаблонных функций.Для таких функций, как ваша, вы должны использовать перегрузку.

template <class T> // abstraction for Agg's type
Min<T> merge(Min<T> agg1, Min<T> agg2) {...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...