этом коде ?
#include <string>
class Settings {
std::string fN;
Settings();
template<auto Settings::* mem, auto Settings::* ... mems>
void parse();
template<auto Settings::* mem>
void parse();
};
template<auto Settings::* mem, auto Settings::* ... mems>
void Settings::parse() {
parse<mem>();
parse<mems...>();
parse<mems>()...;
}
template<>
void Settings::parse<&Settings::fN>() {
}
template<auto Settings::* mem>
void Settings::parse() {
static_assert(!"Parse() not realized for this field");
}
Settings::Settings() {
parse<&Settings::fN>();
}
используйте = delete, а не static_assert. второй умеет стрелять до инстанцирования
Спасибо,но это не основная проблема )
И если использовать delete специализация вообще не учавствует в перегрузке
Кажется, что рекурсия заменяется на фолд очень легко, и проблема исходная уйдет
Я бы рад, заменить на фолд, но что-то не могу придумать как должен выглядеть этот фолд
(parse<mems>(), ...);, где mems - один конкретный пак (не нужно отрезать у него хвост)
Благодарю. Я был близок к использованию comma operator , но я не додумался обернуть это выражение в скобки
У Вас как раз тот случай: bool(string-literal) всегда true, !true всегда false; неинстанцируемый шаблон, не могущий иметь валидных специализаций - недиагностируемая ошибка (IFNDR). fold там (parse<mems>(), ...); же просто.
у меня вот так работает struct Settings { std::string fN; template<auto Settings::* mem1, auto Settings::* mem2, auto Settings::*... rest> void parse() { parse<mem1>(); parse<mem2>(); (parse<rest>(), ...); } template<auto Settings::* mem> void parse() = delete; }; template<> void Settings::parse<&Settings::fN>() { static int i = 1; std::cout << i++ << ' '; } int main () { Settings{}.template parse<&Settings::fN, &Settings::fN, &Settings::fN>(); // 1 2 3 } первая перегрузка с двумя явными аргументами, чтобы не конфликтовала с перегрузкой с одним, ибо пак может быть пустым
Обсуждают сегодня