Cppcheck在这样的代码中发现了一个潜在的问题:
float a, b, c;
int count = sscanf(data, "%f,%f,%f", &a, &b, &c);
Run Code Online (Sandbox Code Playgroud)
它说:"没有字段宽度限制的scanf可能会因大量数据而崩溃".怎么可能?这是某些sscanf实现中的已知错误吗?我知道数字可能会溢出(数字),但程序怎么会崩溃?这在cppcheck中是误报吗?
我发现了一个类似的问题:scanf Cppcheck警告,但答案并不完全令人满意.答案提到了类型安全,但这不应该是一个问题.
我将函数指针传递给函数模板:
int f(int a) { return a+1; }
template<typename F>
void use(F f) {
static_assert(std::is_function<F>::value, "Function required");
}
int main() {
use(&f); // Plain f does not work either.
}
Run Code Online (Sandbox Code Playgroud)
但模板参数F不被识别is_function为函数,静态断言失败.编译器错误消息说,F就是int(*)(int)这是一个函数指针.为什么它表现得那样?在这种情况下,如何识别功能或指针?
我有一个基类Base,很多其他类将派生自.我想定义:
template<typename Derived>
ostream &operator<< (ostream &o, Derived &derived) {
}
Run Code Online (Sandbox Code Playgroud)
但仅适用于派生自的类Base.我需要以前定义的所有内容operator<<用于其他类型.怎么做?那可能吗?
我无法创建ostream &operator<< (ostream &o, Base &base),因为我需要在某些类型特征中使用的确切类型.有什么方法可以在将值作为基类型传递时"推送"派生类型?
我想创建一个带有可变数量模板参数的函数.稍后使用这些参数,函数应该像这样传递它们的位置:
template<typename R, typename Args...>
R myFunction(Data &data, void *function) {
auto f = (R (*)(Args...))function;
return f(read<Args1>(data, 1), read<Args2>(data, 2), ...);// <-- This is the problem
}
Run Code Online (Sandbox Code Playgroud)
给定的代码当然不可编译.有没有办法解决它?有没有一种方法可以做到没有可变参数模板而没有太多的代码重复?
我有一个类应该为每个成员变量调用一个访问者方法.像这样的东西:
class A{
int a, b, c;
public:
void accept(Visitor &visitor){
visitor.visit(a);
visitor.visit(b);
visitor.visit(c);
}
};
Run Code Online (Sandbox Code Playgroud)
如何void accept() const在没有代码重复的情况下使用相同的代码获取方法?
重复的显而易见的解决方案是添加一个方法:
void accept(Visitor &visitor) const {
visitor.visit(a);
visitor.visit(b);
visitor.visit(c);
}
Run Code Online (Sandbox Code Playgroud)
该方法具有我想要的含义,但我想避免代码重复.拥有这两种方法的原因是能够通过"阅读"访问者读取变量并accept很好地使用该方法const.然后非const accept将可用于"写入/更新"访问者.
我们在大学本学期开设了计算机图形学入门课程.关于如何进行实验练习没有推荐的方法.大多数学生都使用Turbo C和内置的graphics.h头文件.
我对此有点担心,Turbo C是70年代的事情并且对它学习东西对我来说似乎毫无意义.我也可以为Bloodshed Dev-C++编译器设置graphics.h,也可以在linux系统上设置libgraph.
Borland graphics.h有一些替代品吗?我正在寻找相对简单的相对现代的解决方案,因为它们不会添加太多的样板代码等,而是实现相同的功能.
为了提供有关我们将要完成的任务的更多信息,我们将实现基本的图形算法,如DDA算法,Bresenham的算法,扫描转换等.所以我需要能够在屏幕上绘制像素,我不需要一个真正的高级库,它可以自己绘制线条和圆形等基元.如果它可以很好但是要学习我应该能够在屏幕上绘制原始像素.
我有一个数据类型,例如class Vector3.现在我需要创建几个具有相同接口的类Vector3,但具有更高级别的语义(例如:Position,Velocity).使用typedef是不够的,因为我需要这些类型是不同的,以便它们可以用于重载.在C++ 0x中我可能使用构造函数继承:
struct Position: public Vector3 {
using Vector3::Vector3;
};
Run Code Online (Sandbox Code Playgroud)
这有什么问题吗?有没有更好的方法呢?是否可以在不使用C++ 0x功能的情况下执行此操作而不必显式编写所有Vector3构造函数?
我有一个类模板:
template<typename T, size_t N> class Vector
Run Code Online (Sandbox Code Playgroud)
我想启用具体的构造函数N,所以我这样做:
Vector(typename boost::enable_if_c<N==2, T>::type const &e0, T const &e1) {
data[0] = e0;
data[1] = e1;
}
Run Code Online (Sandbox Code Playgroud)
但编译器(MSVC 2010 SP1)给出了一个错误,而不是应用SFINAE.错误是:
error C2039: 'type' : is not a member of 'boost::enable_if_c<B,T>'
with
[
B=false,
T=float
]
Run Code Online (Sandbox Code Playgroud)
问题是什么?这是一个已知的问题吗?我该如何解决?它是唯一可以使用的解决方案static_assert吗?
编辑: GCC也没有成功:http://ideone.com/7Ejo8
假设有一个没有孔的多边形和由n顶点定义的自交叉(即简单的多边形).选择v此多边形的反射顶点.
我想找到u从顶点"可见"的同一多边形的任何其他顶点v.通过可见我的意思是,在v和之间的线段u完全位于多边形内部.
是否有算法可以O(N)及时或更好地完成?是否有算法可以及时找到所有可见顶点O(N)?
一项快速研究表明,对于给定的多边形和该多边形内的任何点,可以构造可见性多边形O(N).我假设找到一个可见的顶点应该更容易.