170 похожих чатов

Кто-Нибудь может мне обьяснить почему не выбирается специализированый метод в

этом коде ?
#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>();
}

9 ответов

21 просмотр

используйте = delete, а не static_assert. второй умеет стрелять до инстанцирования

Zlolka-17 Автор вопроса
Ivan Sokolov
используйте = delete, а не static_assert. второй у...

Спасибо,но это не основная проблема )

Zlolka-17 Автор вопроса
Ivan Sokolov
используйте = delete, а не static_assert. второй у...

И если использовать delete специализация вообще не учавствует в перегрузке

Кажется, что рекурсия заменяется на фолд очень легко, и проблема исходная уйдет

Zlolka-17 Автор вопроса
Alexander Karaev
Кажется, что рекурсия заменяется на фолд очень лег...

Я бы рад, заменить на фолд, но что-то не могу придумать как должен выглядеть этот фолд

Zlolka 17
Я бы рад, заменить на фолд, но что-то не могу прид...

(parse<mems>(), ...);, где mems - один конкретный пак (не нужно отрезать у него хвост)

Zlolka-17 Автор вопроса
Alexander Karaev
(parse<mems>(), ...);, где mems - один конкретный ...

Благодарю. Я был близок к использованию comma operator , но я не додумался обернуть это выражение в скобки

Zlolka 17
Спасибо,но это не основная проблема )

У Вас как раз тот случай: bool(string-literal) всегда true, !true всегда false; неинстанцируемый шаблон, не могущий иметь валидных специализаций - недиагностируемая ошибка (IFNDR). fold там (parse<mems>(), ...); же просто.

Zlolka 17
Я бы рад, заменить на фолд, но что-то не могу прид...

у меня вот так работает 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 } первая перегрузка с двумя явными аргументами, чтобы не конфликтовала с перегрузкой с одним, ибо пак может быть пустым

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта