2016-03-05 74 views
0

这里是例子:如何获取非类型模板参数的值?

template <int n> 
class A { }; 

class B { 
public: 
    int foo() { 
    return a.n; // error 
    } 
private: 
    A<10> a; 
}; 

我想在B类比模板A本身以外的实例化的类A<10>的非类型模板参数的值,是有办法做到这一点?或者我应该使用其他一些设计来避免这个问题?

+0

@πάνταῥεῖ但'B'是一个普通的类,没有名为'n'的成员。 – Jaege

+0

你声明'A <10> a',10是一个编译时常量。所以如果它是一个常量,为什么不在'foo'中硬编码数字10? – kamilk

回答

1

如果你不能得到合作(通过发布参数值)的类型,你可以自己一个traits类提取它:

template<class> struct A_param; // not defined 

template<int N> struct A_param<A<N>> { 
    static constexpr int value = N; 
}; 

// a more general implementation would probably want to handle cv-qualified As etc. 

然后使用A_param<decltype(a)>::value

3

您不能像这样访问其他类模板参数。其他类有揭露它,比如:

template <int n> 
class A { 
public: 
    static const int num = n; 
}; 

然后你就可以访问它a.num(或课程的A<10>::num

3

如果你有一个成员A<10>您的B级已经知道了模板参数。改为使用该值。如果模板参数确实没有命名,则让A定​​义一个反映模板参数的成员。

1 -

class B { 
public: 
    int foo() { 
    return n; 
    } 
private: 
    const int n = 10; 
    A<n> a; 
}; 

2 -

template <int n> 
class A { 
public: 
    static const int template_param = n; 
}; 
+0

我可以使用'decltype'或类似编译时类型标识来解决这个问题吗? – Jaege

+0

@Jaege你想解决什么确切的问题? Decltype不能访问模板参数。当从模板创建类时,A 只是类名。如果您需要在运行时访问模板参数,则需要使用常量。 –

+0

我在* C++ Primer *中做了16.14的练习,其中定义了一个类模板'Screen'和一个'Window_mgr'类。在'Window_mgr :: clear()'里面,我需要清理屏幕上的内容。完整的代码是[here](https://ideone.com/6N8z7w)。 – Jaege