LINUX.ORG.RU

контроль параметра шаблона и вменяемый вывод сообщения об ошибке?

 , магия шаблонов


0

2

Скажем есть такая конструкция

template <int D> struct A{
    template <int ... args> void foo(){...}
};
и нужно проверять при компиляции, что при вызове foo
    sizeof...(args)==D
Как это сделать наиболее Ъ?

И как сделать, что бы сообщение о такой ошибке было вменяемым (понятным для пользователя в общем далекого от всей этой кухни)?

Я пока придумал только такое:

template <int D> struct Dcheck{};
template <int D> struct A{
	void foo_checker(Dcheck<D>){}
	template <int ... args> void foo(){
		foo_checker(Dcheck<sizeof ... (args)>());
	}
};

int main(){
	A<3> a;
	a.foo<1,2>();
	return 0;
}
но м.б. можно как то поизящней? Ну и сообщение конечно
$ g++ -std=c++0x  test.cpp
test.cpp: In member function ‘void A<D>::foo() [with int ...args = 1, 2, int D = 3]’:
test.cpp:22:   instantiated from here
test.cpp:15: error: no matching function for call to ‘A<3>::foo_checker(Dcheck<2>)’
test.cpp:13: note: candidates are: void A<D>::foo_checker(Dcheck<D>) [with int D = 3]
хотелось бы попрозрачней (а то мне пользователи потом мосг вынесут вопросами «а у нас не работает!!!»).

★★★★★

Ответ на: комментарий от schizoid

Вау, а я и не знал об static_assert... так там и без constexpr вполне жить можно. Спасибо!

AIv ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.