Здравствуйте, niXman, Вы писали:
X>enable_if, имхо, самый разумный вариант...
X>http://coliru.stacked-crooked.com/a/a76bf9f72a67b833
IMHO, тут самое интересное, что писать внутри {} этого метода...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>IMHO, тут самое интересное, что писать внутри {} этого метода...
можно так:
http://ideone.com/Wa3tAS
Здравствуйте, Erop, Вы писали:
E>IMHO, тут самое интересное, что писать внутри {} этого метода...
ну... элементы в вектор вставлять?
http://coliru.stacked-crooked.com/a/85ac6807a2bd8bfe
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, Went, Вы писали:
W>Что я должен написать вместо троеточия, чтобы количество аргументов, принимаемое функцией set было равно аргументу шаблона S? Я, конечно, могу написать там parameter pack и проверить sizeof... через static_assert, но хочется чтобы красиво, и неверных перегрузок просто не существовало. Ну и грядок enable_if тоже не хочется.
Без sfinae, зато с наследованием
http://ideone.com/dPmiqU
#include <iostream>
using namespace std;
// тип исключительно для сопоставления - кортеж параметров шаблона
template<class... Ts> struct mpl_tuple {};
// утилита для получения кортежа из N повторящихся типов
template<class T, int N, class TUPLE> struct tuple_maker;
template<class T, class... Ts> struct tuple_maker<T,0,mpl_tuple<Ts...>> {
using type = mpl_tuple<Ts...>;
};
template<class T, int N, class... Ts> struct tuple_maker<T,N,mpl_tuple<Ts...>>
: tuple_maker<T,N-1,mpl_tuple<T,Ts...>> {};
template<class T, int N> using make_tuple = typename tuple_maker<T,N,mpl_tuple<>>::type;
// основа для вектора, реализует функцию с нужной сигнатурой
template<class TUPLE> struct VectorBase;
template<class... Ts> struct VectorBase<mpl_tuple<Ts...>> {
void set(Ts... ts) {
cout << __PRETTY_FUNCTION__ << endl;
}
};
// собственно, вектор
template<class T, int N> struct Vector : VectorBase<make_tuple<T,N>> {
// все остальные функции пусть будут здесь
};
int main() {
Vector<int,5> v5;
v5.set(1,2,3,4,5);
}
Но для практического использования придётся как-то налаживать связи между базой и наследником — это будет что-то типа CRTP, и там живут львы.
Здравствуйте, niXman, Вы писали:
E>>IMHO, тут самое интересное, что писать внутри {} этого метода...
X>ну... элементы в вектор вставлять?
X>http://coliru.stacked-crooked.com/a/85ac6807a2bd8bfe
Для этого нет смысла огород городить.
Интересно, если m_data опредеён, как T m_data[size] конечно же.
Но уже дали хорошее решение с инициализацией агрегатом!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском