小编Max*_*eap的帖子

要支持移动语义,函数参数应该由unique_ptr,value还是rvalue获取?

我的一个函数将vector作为参数并将其存储为成员变量.我正在使用const引用,如下所述.

class Test {
 public:
  void someFunction(const std::vector<string>& items) {
   m_items = items;
  }

 private:
  std::vector<string> m_items;
};
Run Code Online (Sandbox Code Playgroud)

但是,有时候items包含大量的字符串,所以我想添加一个支持移动语义的函数(或用新的函数替换它).

我正在考虑几种方法,但我不确定选择哪一种方法.

1)unique_ptr

void someFunction(std::unique_ptr<std::vector<string>> items) {
   // Also, make `m_itmes` std::unique_ptr<std::vector<string>>
   m_items = std::move(items);
}
Run Code Online (Sandbox Code Playgroud)

2)按值传递并移动

void someFunction(std::vector<string> items) {
   m_items = std::move(items);
}
Run Code Online (Sandbox Code Playgroud)

3)右值

void someFunction(std::vector<string>&& items) {
   m_items = std::move(items);
}
Run Code Online (Sandbox Code Playgroud)

我应该避免哪种方法?为什么?

c++ move vector unique-ptr c++11

16
推荐指数
3
解决办法
2117
查看次数

如何返回std :: make_unique <SubClass>工作?

我有一个基类及其子类:

class Base {
    public:
    virtual void hi() {
        cout << "hi" << endl;
    } 
};

class Derived : public Base {
    public:
    void hi() override {
        cout << "derived hi" << endl;
    } 
};
Run Code Online (Sandbox Code Playgroud)

尝试创建一个辅助函数,该函数创建Derived对象的唯一指针.

1)这个工作:

std::unique_ptr<Base> GetDerived() {
    return std::make_unique<Derived>(); 
}
Run Code Online (Sandbox Code Playgroud)

2)但是,这个无法编译:

std::unique_ptr<Base> GetDerived2() { 
    auto a = std::make_unique<Derived>(); 
    return a; 
}
Run Code Online (Sandbox Code Playgroud)

3)std :: move作品:

std::unique_ptr<Base> GetDerived3() {
    auto a = std::make_unique<Derived>();
    return std::move(a); 
}
Run Code Online (Sandbox Code Playgroud)

4)如果我创建一个Base实例,两者都有效:

std::unique_ptr<Base> GetDerived4() {
    auto a = std::make_unique<Base>();
    return a; 
}

std::unique_ptr<Base> GetDerived5() …
Run Code Online (Sandbox Code Playgroud)

c++ move unique-ptr

10
推荐指数
1
解决办法
5384
查看次数

auto* 与 C++ 中的 auto

是否有任何区别auto*,并auto当它们被用于指针?例如,

TestClass t;
auto* a = &t;
auto b = &t;

a->doSomething();
b->doSomething();
Run Code Online (Sandbox Code Playgroud)

我想知道它们是否不同。

c++ pointers auto

9
推荐指数
0
解决办法
9338
查看次数

何时使用dynamic_cast参考?

我正在读这本书"C++之旅",并且无法理解以下段落."不同类型是不可接受的"是什么意思?那么,何时使用指针转换以及何时使用引用转换?有人可以详细说明吗?谢谢.

编辑:另一个问题," 使用带有引用和指针的dynamic_cast时的行为差异 "是询问dynamic_cast的行为,我可以理解 - 返回nullptr或抛出异常.在这个问题中,我问的是何时使用另一个以及何时使用另一个.

"当指向不同派生类的对象的指针是有效参数时,我们将dynamic_cast用于指针类型.然后我们测试结果是否为nullptr.此测试通常可以方便地放在条件中变量的初始化中.当一个不同的类型是不可接受的时,我们可以简单地dynamic_cast到一个引用类型.如果该对象不是预期的类型,则抛出bad_cast:" - C++之旅,第4.5.3节

c++

7
推荐指数
2
解决办法
2984
查看次数

没有用户OAuth流程的YouTube API

我正在尝试使用YouTube Data API(v3)从YouTube视频中获取字幕 https://developers.google.com/youtube/v3/guides/implementation/captions

所以,首先我尝试使用此网址检索字幕列表:https://www.googleapis.com/youtube/v3/captions? part = snippet & videoId = KK9bwTlAvgo & key = {My API KEY}

我可以从上面的链接中检索我想要下载的标题ID(jEDP-pmNCIqoB8QGlXWQf4Rh3faalD_l).

然后,我按照此说明下载了标题:https: //developers.google.com/youtube/v3/docs/captions/download

但是,即使我正确输入了标题ID和我的api密钥,它也会显示"需要登录"错误.

我想我需要OAuth身份验证,但我想要做的是与用户的帐户无关,而只是自动下载公共字幕数据.

我的问题是:有没有办法只处理OAuth身份验证一次,以获取我自己的YouTube帐户的访问令牌,然后在我的应用程序中需要时重复使用它?

python youtube oauth youtube-api caption

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

C++在已创建对象时设置emplace vs insert

class TestClass {
    public:
     TestClass(string s) {

     }
   };
Run Code Online (Sandbox Code Playgroud)

当有TestClass时,我理解了emplace和insert之间的区别(插入副本时的emplace构造)

   set<TestClass> test_set;
   test_set.insert(TestClass("d"));
   test_set.emplace("d");
Run Code Online (Sandbox Code Playgroud)

但是,如果已经存在TestClass对象,它们在机制和性能方面有何不同?

   set<TestClass> test_set;
   TestClass tc("e");
   test_set.insert(tc);
   test_set.emplace(tc);
Run Code Online (Sandbox Code Playgroud)

c++ insert set emplace

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

初始化空字符串的""和{}有什么区别?

string a = "";
string b = {};
Run Code Online (Sandbox Code Playgroud)

我无法找到解释它们之间差异的好参考.编译器有不同的看法吗?那么为什么?

c++ string initialization

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