简体   繁体   English

访问模板类A中的X和Y,如模板<template <int X,int Y> class> class A;

[英]Accessing X and Y in template class A like in template<template<int X, int Y> class> class A;

What is the correct syntax to use template parameters of a template class argument in another template class? 在另一个模板类中使用模板类参数的模板参数的正确语法是什么?

For example: How can I access X and Y of class Param in class Foo? 例如:如何在类Foo中访问类Param的X和Y?

Program: 程序:

template < template < int, int > class X1>
struct Foo {
int foo() {
printf("ok%d %d\n", X1::X, X1::Y);
return 0;
}};

template < int X, int Y >
class Param {
int x,y;
public:
Param(){x=X; y=Y;}
void printParam(){
cout<<x<<" "<<y<<"\n";
}
};

int main() {
Param<10, 20> p;
p.printParam();
Foo< Param > tt;
tt.foo();
return 0;
}

As such for the above code, for the printf statement compiler complains: 对于上面的代码,对于printf语句编译抱怨:

In member function 'int Foo<X1>::foo()':
Line 4: error: 'template<int <anonymous>, int <anonymous> > class X1' used without template parameters
compilation terminated due to -Wfatal-errors.

You can't. 你不能。 The template template parameter means that you take a template name without supplied template arguments . 模板模板参数表示您在没有提供模板参数的情况下获取模板名称。

Foo< Param > tt;

Here you can see that no values are supplied for Param . 在这里,您可以看到没有为Param提供任何值。 You'd take a template template parameter so that Foo itself could instantiate Params with any arguments it likes. 您将获取模板模板参数,以便Foo本身可以使用它喜欢的任何参数来实例化Params

Example: 例:

template < template < int, int > class X1>
struct Foo {

    X1<1, 2> member;

    X1<42, 100> foo();
};

template <int N, int P> struct A {};

template <int X, int Y> struct B {};

Foo<A> a_foo;  //has a member of type A<1, 2>, foo returns A<42, 100>
Foo<B> b_foo; //has a member of type B<1, 2>, foo returns B<42, 100>

But if you want your Foo to output those integers, it has to take real types, not templates. 但是如果你想让你的Foo输出那些整数,它必须采用真实的类型,而不是模板。 Secondly, the names of the template arguments ( X and Y ) are only meaningful where they are in scope. 其次,模板参数( XY )的名称仅在它们在范围内时才有意义。 They are otherwise completely arbitrary identifiers. 否则它们完全是任意标识符。 You can retrieve the values with simple metaprogramming: 您可以使用简单的元编程来检索值:

#include <cstdio>

template <class T>
struct GetArguments;

//partial specialization to retrieve the int parameters of a T<int, int>
template <template <int, int> class T, int A, int B>
struct GetArguments<T<A, B> >
{
   enum {a = A, b = B};
};
//this specialization also illustrates another use of template template parameters:
//it is used to pick out types that are templates with two int arguments

template <class X1>
struct Foo {
  int foo() {
    printf("ok%d %d\n", GetArguments<X1>::a, GetArguments<X1>::b);
    return 0;
  }
};

template < int X, int Y >
class Param {
public:
   void print();
};

//this is to illustrate X and Y are not essential part of the Param template
//in this method definition I have chosen to call them something else
template <int First, int Second> 
void Param<First, Second>::print()
{
   printf("Param<%d, %d>\n", First, Second);
}

int main() {

    Foo< Param<10, 20> > tt;
    tt.foo();
    Param<10, 20> p;
    p.print();
    return 0;
}

This here is an example what could work as well: 这是一个可以工作的例子:

template < typename X1>
struct Foo;

template < template < int, int > class X1, int X, int Y >
struct Foo< X1<X,Y> > {
    int foo() {
        printf("ok%d %d\n", X, Y);
        return 0;
    }
};

template < int X, int Y >
class Param {
    int x,y;
public:
    Param(){x=X; y=Y;}
    void printParam(){
        cout<<x<<" "<<y<<"\n";
    }
};

int main() {
    Param<10, 20> p;
    p.printParam();
    Foo< Param<30,40> > tt;
    tt.foo();
    return 0;
}

You can't take template parameters of a template class argument, since the argument is a template without parameters. 您不能获取模板类参数的模板参数,因为参数是不带参数的模板。 You can do this instead: 你可以这样做:

template < typename X1 >
struct Foo;

template < template < int, int > class X1, int A, int B >
struct Foo< X1< A, B > >
{
    ... here you can use A and B directly, or X1< A, B >::X and X1< A, B >::Y ...
};

You specify the template to take a single type, and specialize it for the case of a template taking two int arguments. 您指定模板采用单一类型,并在模板采用两个int参数的情况下对其进行专门化。 With that definition, you would use it like this: 根据该定义,您可以像这样使用它:

Foo< Param< 0, 1 > > tt;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM