Неоднозначная перегрузка в вариативных шаблонах без аргументов

Связано:


Рассмотрим эту пару вариативные шаблоны:

template
bool All(Param& c) {
    return true;
}

template
bool All(Param& c) {
    return f(c) && All(c);
}

Это работает и компилируется.Однако как написать его без первого параметра шаблона?

Звучит банально? Ну вот что я подумал. :-) Рассмотрим несколько идей.

Идея №1:

template
bool All(Param& c) {
    return f(c) && All(c);
}
template<>
bool All(Param& c) {
    return true;
}

Не сработает ... Когда я пытался это сделать, я имел в виду специализацию, но, судя по второй мысли, это не то, как это работает.

В исходном примере я создал два разных шаблона перегрузок, первый из которых взял 1 параметр шаблона, а второй - 2 или более. Никаких двусмысленностей и никакой специализации. правильно ли я понял?

Идея № 2:

bool All(Param& c) {
    return true;
}

template
bool All(Param& c) {
    return f(c) && All(c);
}

Очевидно, не сработает, Все с отдыхом ... empty не будет расширяться до вызова функции, не являющейся шаблоном.

Идея №3:

Давайте немного перестроим решение.

template
bool All(Param& c) {
    return f(c);
}

template
bool All(Param& c) {
    return f(c) && All(c);
}

Это не подходит, потому что All (c) будет неоднозначным. Следовательно, мне нужно иметь случай 0-arg и случай> 0-arg ... Или как насчет случая 1-arg и случая> 1-arg?

Идея № 3.5:

template
bool All(Param& c) {
    return f(c);
}

template
bool All(Param& c) {
    return f(c) && All(c);
}

Ага, работает, но содержит копипасту (в данном случае просто, но может быть больше!), поэтому я бы сказал, что она не лучше того, с чего я начал. Еще один обходной путь.

Идея №4:

Давайте попробуем №1, но с классами вместо функций.

template
struct All {
    static bool func(Param& c) {
        return f(c) && All(c);
    }
};
template<>
struct All {
    static bool func(Param& c) {
        return true;
    }
};

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

извините, нереализовано: невозможно расширить 'rest ...' в список аргументов фиксированной длины

Разве это не было частью GCC 4.4? Я использую MinGW GCC 4.6.1 (tdm-1).


В любом случае, должен ли я думать, что я не могу сделать такую ​​элементарную вещь прямым способом? Требуется ли использовать обходной путь с дополнительным параметром фиктивного шаблона для выполнения этой задачи?

Или есть простой, правильный вариант для указания случая без аргументов , который будет работать?

9
задан Community 23 May 2017 в 10:27
поделиться