是否有可能克服这个问题:
class Constants
{
static Std_ReturnType dtcSitzheizungSchalteMittelkonsoleHlTasterHaengt( UInt8 const value )
{
return Rte_Call_demSitzheizungSchalteMittelkonsoleHlTasterHaengt_SetEventStatus( value );
}
static DTCSetter * const DTCSETTER_WITH_NO_DID[SEAT_HEATING_DTCS_COUNT]; //how to use an element of this array as a non type template parameter ?
};
template class ButtonStuckPolicy< &Constants::dtcSitzheizungSchalteMittelkonsoleHlTasterHaengt >; //works
在C ++ 03中?
通常,是否可以将静态数组元素作为非类型模板参数传递?
由于
答案 0 :(得分:1)
具有外部链接的任何对象的地址是C ++ 03中的公平游戏。但值不是,除非它是const
并用整数常量表达式初始化。如你所知,子对象在C ++ 11之前不需要应用。
您所拥有的是将地址参数传递给int
参数,该参数在任何上下文中都不起作用。
在C ++ 11中这没关系:
const int x[100] = {}; // zero-initialize
template<int T>
class foo;
foo<x[0]> y;
这就是:
int x[100];
template<int *T>
class foo;
foo<&x[0]> y;
这在C ++ 03中也可以,因为它使用了整个命名对象的地址:
int x[100];
template<int *T>
class foo;
foo<x> y;
答案 1 :(得分:0)
我的解决方案 - 创建模板:
template <int* arr, int index>
class indexer{
public:
static inline int* element(){ return arr+index; }
};
然后你就说
template <int* arr, int index>
foo{
// Here use indexer<arr,index>::element();
};
int x[10];
foo<x,0> f;
或者甚至是:
template <typename T>
bar{
//here use T::element();
};
int x[10];
bar<indexer<x, 0> > b;
它没有foo<&x[0]>
那么漂亮,而且所有专门用于int*
的课程都必须改变专业化,但你可能不会更好(并且工作;)