Вы пробовали с SFINAE?
Я имею в виду ... что-то как (осторожно: код не проверен)
template<typename T>
static typename std::enable_if<0 != sizeof...(PS), T&&>::type Execute(T&& v)
{ return Compound<PS...>::Execute(P::Execute(std::forward<T>(v))); }
template<typename T>
static typename std::enable_if<0 == sizeof...(PS), T&&>::type Execute(T&& v)
{ return P::Execute(std::forward<T>(v)); }
Я имею в виду ... ваш код не может работать, потому чтокогда sizeof...(PS) == 0
строка
return Compound<PS...>::Execute(P::Execute(std::forward<T>(v)));
компилируется и Compound
требуется один или более аргументов шаблона;не может принять нулевой аргумент шаблона.
Я знаю, что эта строка проходит тест
if (sizeof...(PS) > 0)
, но вам нужно if constexpr
if constexpr (sizeof...(PS) > 0)
, чтобы избежатькомпиляция, когда тест ложный;но if constexpr
, к сожалению, доступен только начиная с C ++ 17.
Так что единственное решение, которое я вижу в C ++ 11 - это разрезать метод Execute()
в двух версиях и включить / отключить первуюили второй в соответствии со значением sizeof...(PS)
.