Creating a template: creating templates from templates

This is a way to compose template<int> from template<int, int>

I tried the following code, but it does not compile:

 #include <iostream> template<int N, int M> struct A { enum E { n = N, m = M }; }; template<template<int> class C> struct B : public C<8> { }; int main(int argc, const char *argv[]) { typedef B< A<4> > T; T b; std::cout << T::n << std::endl; std::cout << T::m << std::endl; return 0; } 

Error:

 test3.cxx: In function 'int main(int, const char**): test3.cxx:10:23: error: wrong number of template arguments (1, should be 2) test3.cxx:3:12: error: provided for 'template<int N, int M> struct A test3.cxx:10:25: error: template argument 1 is invalid test3.cxx:10:28: error: invalid type in declaration before '; token test3.cxx:13:22: error: 'T is not a class or namespace test3.cxx:14:22: error: 'T is not a class or namespace 
+4
source share
2 answers

At least in C ++ 03, a template template parameter must have exactly the required number of arguments.

One way to achieve this would be to create a new pattern with the correct artery that delegates the original pattern:

 template<int M> struct Hack : A<4, M> { }; ... typedef B<Hack> T; 
+2
source

The following code prints 4 and 8, I hope I understand your point correctly. The number of parameters in the template did not match the number of templates that you passed.

 #include <iostream> template<int N, int M> struct A { enum E { n = N, m = M }; }; template<template<int, int> class C, int Num> struct B : public C<Num, 8> { }; int main(int argc, const char *argv[]) { typedef B< A, 4 > T; T b; std::cout << T::n << std::endl; std::cout << T::m << std::endl; return 0; } 
+3
source

Source: https://habr.com/ru/post/1389731/


All Articles