Как создать шаблон функции, который расширяет пакет параметров, который не представляет аргумент (ы) функции? - PullRequest
2 голосов
/ 17 апреля 2020

Я извиняюсь, но у меня была большая проблема в выражении дела в одном предложении заголовка.

Проблема: у меня есть шаблон класса, основанный на многих "свойствах" (не принимайте это " ключевое слово property (слишком буквально):

template<typename ... P>
class C: public P... {}

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

template<typename ... P>
void foo(C<P> &c1, C<P> &c2)
{
    { doSomething<p>()... }      // for each type p in pack P
}

template<typename T>
void doSomething() {}

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

1 Ответ

4 голосов
/ 17 апреля 2020

Мне кажется, что вам просто не хватает расширения пакета параметров в параметрах функции. Кроме того, существует небольшая опечатка (p -> P), и вы, похоже, намереваетесь использовать выражение сгиба для выполнения функции для всех типов, имеющих немного другой синтаксис:

template<typename ... P>
void foo(C<P...> &c1, C<P...> &c2)
{
    // Parentheses and comma required to signify fold expression using the comma operator
    ( doSomething<P>(), ... ); 
}

Мне также кажется, что вы захотите передать c1 и c2 на doSomething (что, вероятно, должно принимать объекты как T&, я полагаю?), В противном случае эта функция будет зависеть только от типа, не фактический объект этого типа.

...