Пусть есть такая конструкция:
template
Каким образом можно "уговорить" компилятор принимать в пакет только одинаковые типы, и как указать конкретный тип (пусть, например, double)?
Ответ
Вопрос решен
Помогло чтение "Язык программирования С++. Лекции и упражнения. 6-е издание, 2012 год, Сивен Пратта".
Методика, как оказалось, незатейлива - рекурсивная распаковка и чек каждого аргумента пака. Получилось два варианта, но со static_assert'ом, имхо, лучше - более осмысленный вывод. В качестве эксперимента проверяем агрументы на соответствие std::size_t.
Вариант 1 (static_assert):
#include
////////////////////////////////////////////////////////////////////
// Пример проверки передачи беззнаковых аргументов в конструктор
// Вариант 1 (используем static_assert)
////////////////////////////////////////////////////////////////////
template
int main() {
// норм - передаётся нужный тип
std::size_t i=1,j=2,k=3;
SomeClass
// норм - передаются беззнаковые константы
SomeClass
// фэйл - знаковые типы не проходят
// int a=1,b=2,c=3;
// SomeClass
return 0;
}
Вариант 2 (std::enable_if):
#include
////////////////////////////////////////////////////////////////////
// Пример проверки передачи беззнаковых аргументов в конструктор
// Вариант 2 (используем std::enable_if)
////////////////////////////////////////////////////////////////////
template
int main() {
// норм - передаётся нужный тип
std::size_t i=1,j=2,k=3;
SomeClass
// норм - передаются беззнаковые константы
SomeClass
// фэйл - знаковые типы не проходят
// int a=1,b=2,c=3;
// SomeClass
return 0;
}
В принципе, вопрос решен. Однако, если будут более изящные варианты - вэлкомъ! :)
Комментариев нет:
Отправить комментарий