template <template <typename T, T a> class U, U<int, 42> b> struct C;
Вроде не баян
Код некорректный, Комо его тоже ругает
"ComeauTest.c", line 1: error: a nontype template parameter may not have class type
template <template <class T, T a> class U, U<int, 42> b> struct C;
^
У меня такое скомпилировалось
не знаю, это ли вам нужно
template <template <typename T, T a> class U, typename V = U<int, 42> >
struct C
{
};
template <typename A, A a>
class X
{
};
int main()
{
C<X> x;
return 0;
}
Здравствуйте, Chorkov, Вы писали:
C>Здравствуйте, R.O. Prokopiev, Вы писали:
ROP>>
ROP>>template <template <typename T, T a> class U, U<int, 42> b> struct C;
ROP>>
ROP>>Код некорректный, Комо его тоже ругает ROP>>Но как исправить не пойму.
C>Объект не может быть аргументом шаблона. C>Можно переделать второй аргумент на указатель на U<int, 42> ?
Точно. Пропустил.
Однако, так тоже падает:
template <template <typename T, T a> class U, U<int, 42> *b> struct C;
(Комо это съел)
Re[2]: Хочу передать в шаблон указатель на специализацию
Здравствуйте, _nn_, Вы писали:
__>Здравствуйте, R.O. Prokopiev, Вы писали:
__>Обычно вместо template template можно использовать более простую технику с одним template. __>
Здравствуйте, глубокоуважаемейший R.O. Prokopiev, Вы писали:
ROP>Хочу передать в шаблон указатель на экземпляр любой специализации шаблона. ROP>Что то в таком духе:
template <template <typename T, T a> class U *b> struct C{};
A<int, 42> a42;
A<char, 17> a17;
C<&a17> c17;
C<&a42> c42;
ROP>Компилер не понимает первую строку. Затрудняюсь. ROP>В крайнем случае проброшу параметры A в C явно, но этого не хотелось бы.
Вот так тоже не работает:
template <A<typename T, T a> *b> struct C{};
Re[3]: Хочу передать в шаблон указатель на специализацию
Здравствуйте, _nn_, Вы писали:
__>Здравствуйте, R.O. Prokopiev, Вы писали:
ROP>>Хочу передать в шаблон указатель на экземпляр любой специализации шаблона.
__>Кстати, а почему нужно именно через шаблон, неужели через конструктор не подходит ?
Класс C будет хранить только одно значение типа (int, char и т.д.).
Остальную информацию думаю передавать через тип C.
Re[5]: Хочу передать в шаблон указатель на специализацию
Здравствуйте, R.O. Prokopiev, Вы писали:
ROP>Здравствуйте, _nn_, Вы писали:
__>>Здравствуйте, R.O. Prokopiev, Вы писали:
ROP>>>Хочу передать в шаблон указатель на экземпляр любой специализации шаблона.
__>>Кстати, а почему нужно именно через шаблон, неужели через конструктор не подходит ? ROP>Класс C будет хранить только одно значение типа (int, char и т.д.).
Класс А имелся ввиду ?
ROP>Остальную информацию думаю передавать через тип C.
Здравствуйте, _nn_, Вы писали:
__>Здравствуйте, R.O. Prokopiev, Вы писали:
ROP>>Здравствуйте, _nn_, Вы писали:
__>>>Здравствуйте, R.O. Prokopiev, Вы писали:
ROP>>>>Хочу передать в шаблон указатель на экземпляр любой специализации шаблона.
__>>>Кстати, а почему нужно именно через шаблон, неужели через конструктор не подходит ? ROP>>Класс C будет хранить только одно значение типа (int, char и т.д.). __>Класс А имелся ввиду ?
ROP>>Остальную информацию думаю передавать через тип C.
__>Не ясна ваша затея.
Поля Галуа реализую.
Класс C содержит одно поле элементарного типа.
Для C переопределены арифметические операции.
Но реализация этих операций зависит от конкретного экземпляра структуры A (таблицы перекодировки и др).
Другими словами:
A — GaloisField
С — FieldElement
В библиотеке Schifra каждый элемент тащит с собой ссылку на поле, нафиг это нужно.
Re[7]: Хочу передать в шаблон указатель на специализацию
Здравствуйте, R.O. Prokopiev, Вы писали:
ROP>Здравствуйте, _nn_, Вы писали:
__>>Здравствуйте, R.O. Prokopiev, Вы писали:
ROP>>>Здравствуйте, _nn_, Вы писали:
__>>>>Здравствуйте, R.O. Prokopiev, Вы писали:
ROP>>>>>Хочу передать в шаблон указатель на экземпляр любой специализации шаблона.
__>>>>Кстати, а почему нужно именно через шаблон, неужели через конструктор не подходит ? ROP>>>Класс C будет хранить только одно значение типа (int, char и т.д.). __>>Класс А имелся ввиду ?
ROP>>>Остальную информацию думаю передавать через тип C.
__>>Не ясна ваша затея. ROP>Поля Галуа реализую.
Я в этом увы не силен еще
ROP>Класс C содержит одно поле элементарного типа. ROP>Для C переопределены арифметические операции. ROP>Но реализация этих операций зависит от конкретного экземпляра структуры A (таблицы перекодировки и др).
Что значит от конкретного ?
Если следует что нужен экземпляр класса, то его и передать нужно в конструкторе и хранить его (ссылку или как угодно).
Тут же у нас могут быть несколько экземпляров класса.
A a1;
A a2;
C<A> c1(a1);
C<A> c2(a2);
Несмотря на то что тип у c1,c2 один, у них разное поведение.
Если экземпляр всегда один, т.е. паттерн Singleton (одиночка) то тогда не нужно вообще ничего передавать.
template<typename T, T a> struct A {};
template<typename T, T* ptr> struct C;
template<int a, A<int, a>* ptr> struct C<A<int, a>, ptr> {};
template<char a, A<char, a>* ptr> struct C<A<char, a>, ptr> {};
A<int, 1> a;
C<A<int, 1>, &a> c;
ROP>Другими словами: ROP>A — GaloisField ROP>С — FieldElement
ROP>В библиотеке Schifra каждый элемент тащит с собой ссылку на поле, нафиг это нужно.
Т.е. само поле вы хотите перетащить из времени выполнения во время компиляции ?
А если во время выполнения хотим создать поле, то как тогда ?
Здравствуйте, _nn_, Вы писали:
ROP>>Класс C содержит одно поле элементарного типа. ROP>>Для C переопределены арифметические операции. ROP>>Но реализация этих операций зависит от конкретного экземпляра структуры A (таблицы перекодировки и др).
__>Или же частичная специализация C __>
__>template<typename T, T a> struct A {};
__>template<typename T, T* ptr> struct C;
__>template<int a, A<int, a>* ptr> struct C<A<int, a>, ptr> {};
__>template<char a, A<char, a>* ptr> struct C<A<char, a>, ptr> {};
__>A<int, 1> a;
__>C<A<int, 1>, &a> c;
__>
Я и пришел к подобному варианту.
ROP>>Другими словами: ROP>>A — GaloisField ROP>>С — FieldElement
ROP>>В библиотеке Schifra каждый элемент тащит с собой ссылку на поле, нафиг это нужно. __>Т.е. само поле вы хотите перетащить из времени выполнения во время компиляции ?
Вроде того. __>А если во время выполнения хотим создать поле, то как тогда ?
Это не понадобится. Преобразование из одного поля в другое (изоморфное ему) я на всякий случай сделаю.
Re[9]: Хочу передать в шаблон указатель на специализацию
Здравствуйте, _nn_, Вы писали:
__>Тут не ясно для чего нужен класс A. __>Не проще ли передать само значение в С и все ? __>Да и вообще не ясно зачем городить столько шаблонов __>
Ну я уже писал. С это элементарное значение (char, short, м.б. int ).
А — это различные таблицы для реализации операций.
Таскать в C что либо кроме значения элемента я считаю накладным.
Re[10]: Хочу передать в шаблон указатель на специализацию
Здравствуйте, _nn_, Вы писали:
__>Тут не ясно для чего нужен класс A. __>Не проще ли передать само значение в С и все ? __>Да и вообще не ясно зачем городить столько шаблонов
Кстати, да.
Идея. Класс A можно сделать статическим членом C.