假设我正在为二叉树创建一个类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页面有不同类型的功能,但不是类朋友关系的例子(和猜测语法没有收敛的解决方案还).我更愿意了解如何使我希望定义的朋友关系类型的规范更正确.
我正在构建一个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 = "ε"];
3 -> 4 [weight = 10];
edge[label …Run Code Online (Sandbox Code Playgroud) 我有一个仿函数,它运行在类似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()?
所以我正在使用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宏.
在有效的STL项目22中,迈耶斯似乎暗示T&将一个T实例化为临时的; 那是
T x;
T& y = x;
((T)(y)).doSomething();
Run Code Online (Sandbox Code Playgroud)
结果doSomething()是在临时而不是x.
为什么演员必须暂时?