我正在尝试创建仅在模板实例化时执行某些代码的程序(它将用于低级驱动程序初始化).现在我有以下解决方案.
class Initializer
{
public:
Initializer(){
// This code is executed once
}
void silly() const{
}
};
template <class T>
class Proxy{
protected:
static const Initializer init;
};
template<class T>
const Initializer Proxy<T>::init;
template<class T>
class MyTemplate : public Proxy<void>{
public:
static void myMethod1(){
init.silly();
// ... Something useful
}
static void myMethod2(){
init.silly();
// ... Something useful
}
};
Run Code Online (Sandbox Code Playgroud)
该Initializer默认构造函数只在情况下,我呼吁执行myMethod1()或myMethod2()地方.
但有没有办法摆脱这些init.silly();线?
我的static_assert功能有问题.当我直接实例化一个类模板时,一切都按预期工作.但是当我将它作为不同类模板的参数传递时,static_assert不起作用.
template <int X>
class A{
static_assert(X == 0, "X != 0");
};
template <class T>
class B{
};
B<A<1>> b; // Static assert does not work
A<1> a; // error: static assertion failed: X != 0
Run Code Online (Sandbox Code Playgroud)
编辑
谢谢大家的答案.有没有办法显式实例化A而不创建A实例/从A继承?我在尝试这个:
template <int X>
class A{
static_assert(X == 0, "X != 0");
};
template <class T>
class B;
template <template <int X> class T, int X>
class B<T<X>>{
template class T<X>;
};
Run Code Online (Sandbox Code Playgroud)
但这是不正确的.
为什么这样做呢?
uint8_t array[4] = {1,2,3,4};
uint8_t* parray = array;
uint8_t (*p1)[4] = (uint8_t (*)[4])&array;
uint8_t (*p2)[4] = (uint8_t (*)[4])&parray;
uint8_t (*p3)[4] = (uint8_t (*)[4])parray;
uint8_t test1 = **p1; // test1 = 1
uint8_t test2 = **p2; // test2 = something random
uint8_t test3 = **p3; // test3 = 1
Run Code Online (Sandbox Code Playgroud)
parray显然与数组几乎相同.例如,array [0] == parray [0].但是当我想将指向数组的指针作为指向固定大小数组的指针时,我必须使用&符号.当我想要得到的指针粒子阵列,我不得.
实际的例子.
有一个函数接受指向固定大小数组的指针
void foo(uint8_t (*param)[4])
{
...
}
Run Code Online (Sandbox Code Playgroud)
当我将另一个函数中的param作为指针时,我可以通过这种方式传递给foo吗?
void bar(uint8_t param*)
{
uint8_t (*p)[4] …Run Code Online (Sandbox Code Playgroud)