小编jim*_*iki的帖子

工厂:如何将临时智能指针传递给函数.C++

我有一堂课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)

c++ factory smart-pointers temporary

23
推荐指数
2
解决办法
2011
查看次数

如何将"指针指针类型"转换为const?

使用以下代码

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的关键概念我不知道了?

c++ const const-cast

17
推荐指数
2
解决办法
2458
查看次数

从R中的情节中获取xlim

我想在同一个地块上有一个直方图和一个密度,我正在尝试这个:

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中获取它们?我还应该做些什么呢?

plot r

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

编译器无法推断出std :: max的重载

用我的编译器

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的重载.

这种行为是否正常?

什么是最便携和正确的写作方式?

c++ stl overload-resolution std-function

9
推荐指数
1
解决办法
155
查看次数

c ++ - 从自定义类转换为内置类型

为了清楚起见,让我的新课程成为:

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类自动转换为内置类型?

c++ casting

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

end()迭代器上的指针算术

让A成为a std::vector<double>,

这个定义明确吗?

if(!A.empty())
    std::vector<double>::iterator myBack = A.end() - 1;
Run Code Online (Sandbox Code Playgroud)

end迭代器是否仅适用于均等和不等式检查?或者只要我留在容器中,我就可以执行一些指针运算?

在我的平台上,此代码有效.我想知道这是否便携.

c++ iterator stl

6
推荐指数
2
解决办法
1177
查看次数

返回值优化:我可以避免复制庞大的STL容器.

当我想要一个函数给我一个容器时:

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)

我的努力没有意义,因为我可以确定编译器总是使用返回值优化吗?

c++ rvo

5
推荐指数
1
解决办法
344
查看次数

发生break语句时生成器销毁

我想知道什么时候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__方法时,我可以依赖于此并提供一些我想要完成的任务吗?

python generator

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

由value传递的c ++ copy构造参数

我希望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)

c++ pass-by-reference pass-by-value pass-by-const-reference

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

C ++习惯用法:如何将右值作为右值传递?

以下代码无法编译。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)

有更好的成语吗?

c++ reference rvalue c++11

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

git reset 到之前的提交然后推送

尝试通过 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 方法。如果不是,如何正确完成此操作?

git git-revert

0
推荐指数
1
解决办法
188
查看次数

如何用零重置内置函数的C++向量?

如果效率是一个问题,我需要矢量,我应该使用什么?

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()

c++ vector

-1
推荐指数
1
解决办法
97
查看次数