我有一堂课Foo
class Foo;
Run Code Online (Sandbox Code Playgroud)
工厂返回指针:
std::unique_ptr<Foo> createFoo();
Run Code Online (Sandbox Code Playgroud)
因为Herb告诉我,在Foo的一生中没有特别要求的普通函数应该采用简单的指针:
void plainf(Foo* f);
Run Code Online (Sandbox Code Playgroud)
我的客户应该如何正确地做到这一点?
plainF(createFoo());
Run Code Online (Sandbox Code Playgroud)
如果他不得不写,他会不高兴:
auto someName = createFoo();
plainF(someName.get());
Run Code Online (Sandbox Code Playgroud) 使用以下代码
void TestF(const double ** testv){;}
void callTest(){
double** test;
TestF(test);
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
'TestF' : cannot convert parameter 1 from 'double **' to 'const double **'
Run Code Online (Sandbox Code Playgroud)
我不明白为什么.为什么test不能默默地投入const double**?我为什么要明确地这样做?我知道
TestF(const_cast<const double**>(test))
Run Code Online (Sandbox Code Playgroud)
使我的代码正确,但我觉得这应该是不必要的.
是否有一些关于const的关键概念我不知道了?
我想在同一个地块上有一个直方图和一个密度,我正在尝试这个:
myPlot <- plot(density(m[,1])), main="", xlab="", ylab="")
par(new=TRUE)
Oldxlim <- myPlot$xlim
Oldylim <- myPlot$ylim
hist(m[,3],xlim=Oldxlim,ylim=Oldylim,prob=TRUE)
Run Code Online (Sandbox Code Playgroud)
但我无法访问myPlot的xlim和ylim.
有没有办法从myPlot中获取它们?我还应该做些什么呢?
用我的编译器
typedef const double&(*fT)(const double&, const double&);
typedef std::function<const double&(const double&, const double&)> std_func;
fT f1 = std::max<double>; //(1)
std_func f2 = static_cast<fT>(std::max<double>); //(2)
std_func f3 = f1; //(3)
Run Code Online (Sandbox Code Playgroud)
(1,2,3)工作但是
auto f4 = std::max<double>; //(4)
std_func f5 = std::max<double>; //(5)
Run Code Online (Sandbox Code Playgroud)
(4,5)不要.编译器抱怨它无法选择案例5的重载.
这种行为是否正常?
什么是最便携和正确的写作方式?
为了清楚起见,让我的新课程成为:
class MyInt{
public:
MyInt(int x){theInt = x /10;}
int operator+(int x){return 10 * theInt + x;}
private
int theInt;
};
Run Code Online (Sandbox Code Playgroud)
让我们说我希望能够定义:
MyInt Three(30);
int thirty = Three;
Run Code Online (Sandbox Code Playgroud)
但是为了得到这个结果,我写道:
MyInt Three(30);
int thirty = Three + 0;
Run Code Online (Sandbox Code Playgroud)
如何从我的Custom类自动转换为内置类型?
让A成为a std::vector<double>,
这个定义明确吗?
if(!A.empty())
std::vector<double>::iterator myBack = A.end() - 1;
Run Code Online (Sandbox Code Playgroud)
end迭代器是否仅适用于均等和不等式检查?或者只要我留在容器中,我就可以执行一些指针运算?
在我的平台上,此代码有效.我想知道这是否便携.
当我想要一个函数给我一个容器时:
vector<T> func(){
vector<T> result;
...
return result;
}
Run Code Online (Sandbox Code Playgroud)
以下列方式使用:
vector<T> result = func();
Run Code Online (Sandbox Code Playgroud)
为了避免复制我的容器的开销,我经常编写函数,以便它只返回容器的非const实例.
void func(vector<T>& result){
result.clear();
...
result;
}
Run Code Online (Sandbox Code Playgroud)
以下列方式使用:
vector<T> result;
func(result);
Run Code Online (Sandbox Code Playgroud)
我的努力没有意义,因为我可以确定编译器总是使用返回值优化吗?
我想知道什么时候Obj.将调用del()方法.
def my_integers():
Obj = ExitObj()
i = 0
while(1):
yield i
i += 1
def test_fun():
for i in my_integers():
if i > 3:
break
anything_function()
test_fun()
Run Code Online (Sandbox Code Playgroud)
我做了一个测试,Obj似乎在break语句之后删除:在anything_function()之前循环.
当循环留给生成器内定义的对象的__ del__方法时,我可以依赖于此并提供一些我想要完成的任务吗?
我希望freeFunct在它自己的对象副本a上做非const的东西.
假设freeFunct需要是一个自由函数,因为在实际代码中它需要许多不同的参数,从所有这些函数调用几个公共函数,并且没有必要使它成为任何类的非静态成员函数.
我想到了三种不同的宣告方式.
我觉得第三种解决方案更糟糕.
前两个有什么区别吗?
还有更好的东西吗?
void freeFunct1(A a){
a.doStuff();
}
void freeFunct2(const A& a){
A b = a;
b.doStuff();
}
/**users of freeFunct3 are expected
*to give a copy of their variable:
*{
* A b = a;
* freeFunct3(b);
*}
*/
void freeFunct3(A& a){
a.doStuff();
}
Run Code Online (Sandbox Code Playgroud) 以下代码无法编译。Clang给出以下错误信息:
candidate function not viable: no known conversion from 'A' to 'A &&' for 1st argument
好像a里面f()是一个左值。
struct A{};
void g(A&& a){
return;
}
void f(A&& a){
g(a);
}
int main(){
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是合理的,因为防止多次f()调用g()。
以下将修复我的代码:
g(std::move(a));
Run Code Online (Sandbox Code Playgroud)
不过看上去错我:想会发生什么,如果有人修改了签名f()来void f(A& a)。
有更好的成语吗?
尝试通过 git reset 恢复到之前的提交(例如 123abc)时
git reset --hard 123abc
git commit -a -m "revert to 123abc"
Run Code Online (Sandbox Code Playgroud)
我不能推动这个(我需要在拉之前拉动我向前)。我带着这几行来了:
for i in `git diff --name-only 123abc`; do git checkout 123abc $i; done
git commit -a -m "revert to 123abc"
Run Code Online (Sandbox Code Playgroud)
从现在开始哪个有效
git diff --name-only 123abc
Run Code Online (Sandbox Code Playgroud)
是空的
我想知道这是 hack 还是 git 方法。如果不是,如何正确完成此操作?
如果效率是一个问题,我需要矢量,我应该使用什么?
assert(myVector.size() == wantedSize)
memset(&*myVector.begin(),0,myVector.size() * sizeof(T));
myVector.clear();
myVector.resize(wantedSize);
myVector.clear();
myVector.assign(wantedSize,0);
Run Code Online (Sandbox Code Playgroud)
我可以假设wantSize = size()