小编val*_*tin的帖子

强制模板静态成员实例化

我正在尝试创建仅在模板实例化时执行某些代码的程序(它将用于低级驱动程序初始化).现在我有以下解决方案.

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();线?

c++ static templates instantiation

6
推荐指数
1
解决办法
440
查看次数

static_assert和类模板

我的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)

但这是不正确的.

c++ templates static-assert c++11

3
推荐指数
1
解决办法
1035
查看次数

指向固定大小数组行为的指针

为什么这样做呢?

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)

c c++ arrays pointers strict-aliasing

2
推荐指数
1
解决办法
1026
查看次数