小编Mic*_*len的帖子

模板类朋友的类模板,这里到底发生了什么?

假设我正在为二叉树创建一个类BT,我有一个描述树的元素的类BE,类似于

template<class T> class BE {
    T *data;
    BE *l, *r;
public:
...
    template<class U> friend class BT;
};

template<class T> class BT {
    BE<T> *root;
public:
...
private:
...
};
Run Code Online (Sandbox Code Playgroud)

这似乎有效; 但我对下面发生的事情有疑问.

我最初试图宣布这位朋友为

template<class T> friend class BT;
Run Code Online (Sandbox Code Playgroud)

但是这里似乎有必要使用U(或其他东西T),为什么会这样?这是否意味着任何特定BT的朋友对任何特定的BE班级都是朋友?

在模板和朋友IBM页面有不同类型的功能,但不是类朋友关系的例子(和猜测语法没有收敛的解决方案还).我更愿意了解如何使我希望定义的朋友关系类型的规范更正确.

c++ templates class

71
推荐指数
2
解决办法
8万
查看次数

Graphviz .dot节点排序

我正在构建一个epsilon NFA,以使用规范构造识别正则表达式.我正在使用子图来对正则表达式的各个部分进行分组.由于dot决定移动节点的顺序,*运算符给了我特别的麻烦.我已经尝试添加边缘权重以强制特定边缘变短以保持边缘的顺序,但这似乎不起作用.

我想要做的是强制子图中的节点按特定顺序放置,以便输出图可以识别为特定类型的(众所周知的)构造.在下面的示例中,我希望边缘3,4,5和6按此顺序放置,但是点将它们按6,3,4,5的顺序放置.任何指针都会被欣赏.

请注意,当前权重参数与完全没有权重参数没有任何区别.

我有以下内容

digraph G {
    rankdir = LR;
    node [shape = none];
            0 [label = "start"];
    node [shape = circle];
            1 [label = "q1"];
            2 [label = "q2"];
            3 [label = "q3"];
            4 [label = "q4"];
            5 [label = "q5"];
    node [shape = doublecircle];
            6 [label = "q6"];
    subgraph re1 {
            rank = same;
            edge[label = "0"];
            1 -> 2;
    };
    subgraph re2 {
            rank = same;
            edge[label = "&epsilon;"];
                    3 -> 4 [weight = 10];
            edge[label …
Run Code Online (Sandbox Code Playgroud)

dot graphviz

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

C++确定容器是否有:: find()

我有一个仿函数,它运行在类似U元素类型的容器上T

template<typename T, template<typename...> class U>
class asserter 
{
public:
    asserter(U<T> &c) : container(c) { };
    void operator()(T lhs) 
    {
        CU_ASSERT(container.find(lhs) != container.end());
    };
private:
    U<T>    &container;
};
Run Code Online (Sandbox Code Playgroud)

我可以用它作为

std::set<std::string> a, c;
...
asserter<std::string, std::set> ass(c);
for_each(a.begin(), a.end(), ass);
Run Code Online (Sandbox Code Playgroud)

我们std::includes()暂时无视的地方.

如果容器U::find()是定义的容器,这很有用.如果不是我想回归std::find().另一方面U::find(),std::find()如果它可用,我宁愿使用它.

在C++ 11中(如果需要,可以U::find()是17)我可以确定U是否可用(可能限制为STL),如果是,请使用它,否则使用std::find()

c++ stl traits sfinae c++11

7
推荐指数
1
解决办法
240
查看次数

比较C中的浮点数进行单元测试

所以我正在使用CUnit进行单元测试.我期待类似的东西

float x;
x = atof("17.99");
Run Code Online (Sandbox Code Playgroud)

我想用断言测试这个; 显然我可以用一些小ε

CU_ASSERT(abs(x - atof("17.99")) < epsilon);
Run Code Online (Sandbox Code Playgroud)

不过我正在考虑

r = atof("17.99");
CU_ASSERT(0 == memcmp(&x, &r, sizeof(float));
Run Code Online (Sandbox Code Playgroud)

这看起来确实有效.我希望使用它来避免必须根据值在每个测试中手动设置epsilon.在上述情况下,1e-6应该足够了; 但是如果使用1e-6的epsilon值为1e-10可能不会出现问题.开发人员拥有的选择越多,就越容易出错.

我的问题是:这种技术在posix系统上是否应该稳定?也就是说,如果要比较的两个浮点数是由完全相同的步骤生成的,那么它们的内部表示应完全相同.

编辑:更重要的是,我最终想要一个CU_ASSERT_FLOAT_EQUAL宏.

c floating-point arithmetic-expressions

4
推荐指数
1
解决办法
2143
查看次数

为什么要将类型T&T转换为T创建一个临时的?

在有效的STL项目22中,迈耶斯似乎暗示T&将一个T实例化为临时的; 那是

T x;
T& y = x;
((T)(y)).doSomething();
Run Code Online (Sandbox Code Playgroud)

结果doSomething()是在临时而不是x.

为什么演员必须暂时?

c++ casting reference

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