Связано:
Рассмотрим эту пару вариативные шаблоны:
template
bool All(Param& c) {
return true;
}
template
bool All(Param& c) {
return f(c) && All(c);
}
Это работает и компилируется.Однако как написать его без первого параметра шаблона?
Звучит банально? Ну вот что я подумал. :-) Рассмотрим несколько идей.
template
bool All(Param& c) {
return f(c) && All(c);
}
template<>
bool All(Param& c) {
return true;
}
Не сработает ... Когда я пытался это сделать, я имел в виду специализацию, но, судя по второй мысли, это не то, как это работает.
В исходном примере я создал два разных шаблона перегрузок, первый из которых взял 1 параметр шаблона, а второй - 2 или более. Никаких двусмысленностей и никакой специализации. правильно ли я понял?
bool All(Param& c) {
return true;
}
template
bool All(Param& c) {
return f(c) && All(c);
}
Очевидно, не сработает, Все
с отдыхом ...
empty не будет расширяться до вызова функции, не являющейся шаблоном.
Давайте немного перестроим решение.
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);
}
Ага, работает, но содержит копипасту (в данном случае просто, но может быть больше!), поэтому я бы сказал, что она не лучше того, с чего я начал. Еще один обходной путь.
Давайте попробуем №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).
В любом случае, должен ли я думать, что я не могу сделать такую элементарную вещь прямым способом? Требуется ли использовать обходной путь с дополнительным параметром фиктивного шаблона для выполнения этой задачи?
Или есть простой, правильный вариант для указания случая без аргументов , который будет работать?