2012-10-01 5 views
5

Можно создать дубликат:
using declaration in variadic templateVARIADIC расширение с использованием декларирование

Недавно я наткнулся на a generic mechanism для объединения двух объектов функции, чтобы сформировать новый функциональный объект, который ведет себя, как если бы первые два были перегружены:

template <typename F1, typename F2> 
struct overload : public F1, public F2 
{ 
    overload(F1 f1, F2 f2) : F1(f1), F2(f2) {} 

    using F1::operator(); 
    using F2::operator(); 
}; 

Я пытаюсь расширить эту идею t изг для функциональных объектов N, используя VARIADIC шаблоны:

template <typename... Fs> 
struct overload : public Fs... 
{ 
    overload(Fs... fs) : Fs(fs)... {} 

    using Fs::operator();... 
}; 

Однако GCC жалуется на мои попытки сделать VARIADIC расширения на использование декларирования:

test.cpp:6:24: error: parameter packs not expanded with '...': 
    using Fs::operator();... 
         ^
test.cpp:6:24: note:   'Fs' 
test.cpp:6:26: error: expected unqualified-id before '...' token 
    using Fs::operator();... 
         ^

Я попытался некоторые изменения, такой как:

using Fs::operator()...; 

и

using Fs...::operator(); 

но и не трюк.

Возможно ли это?

+1

Обратите внимание, что тип класса с оператором преобразования, например, Тип указателя функции (так называемая функция суррогатного вызова) является функторным типом и все же несовместим с таким механизмом. Это не имеет большого значения, потому что они экзотичны, но это немного расстраивает, чтобы не быть полностью родовым (TTBOMK). –

+1

[This] (http://stackoverflow.com/questions/7870498/using-declaration-in-variadic-template) может быть полезным (если не для ответа, по крайней мере, для того, что было предпринято). –

+0

@Luc: Разве это не прямой дубликат? Проголосовал за закрытие. – Xeo

ответ

0

Вместо “ я недавно наткнулся на общий механизме ”, пожалуйста предоставить ссылки таких как “ я недавно наткнулся blog posting by Dave Abrahams описанием общего механизма ” & hellip ;.

Я сомневаюсь, что расширение параметров пакета поддерживается using заявления, и я ’ жаль я не ’ т есть время, чтобы проверить стандартный – что ’ сек снова вашей работы, читать документацию, прежде чем спрашивать вопрос.

Но, как практический вопрос решения проблемы (а не вопрос на языке), вы всегда можете кодировать это рекурсивно, а не использовать прямое расширение. Просто наследуйте от класса, который вводит остальные функторы, а затем вводите первый. Где “ остальное ” - это рекурсивный шаг, заканчивающийся пустым списком функторов как базовый случай.

+0

Я хотел добавить ссылку на то, где я видел этот механизм, но я не мог найти статью или вспомнить ее имя в то время, когда я написал вопрос. Спасибо, что выкопали! – HighCommander4

+0

Рекурсивное решение - хорошая идея. На самом деле статья, с которой вы связались, имеет ссылку в сноске (https://gist.github.com/3779345) к такому решению. – HighCommander4

+0

@ HighCommander4: Хе-хе, я не знал. –

Смежные вопросы