小编Dan*_*man的帖子

C++智能指针const正确性

我在类中有一些容器,例如vector或map,它包含生活在堆上的对象的shared_ptr.

例如

template <typename T>
class MyExample
{
public:

private:
    vector<shared_ptr<T> > vec_;
    map<shared_ptr<T>, int> map_;
};
Run Code Online (Sandbox Code Playgroud)

我希望有一个这个类的公共接口,有时会将shared_ptrs返回给const对象(via shared_ptr<const T>),有时shared_ptr<T>我允许调用者改变对象.我想要逻辑const正确性,所以如果我将方法标记为const,它就不能更改堆上的对象.

问题:

1)我对shared_ptr<const T>和的可互换性感到困惑shared_ptr<T>.当有人经过一个shared_ptr<const T>shared_ptr的进级,做我把它存储为一个shared_ptr<T>shared_ptr<const T>载体内,映射或修改我的地图,矢量类型(例如insert_elemeent(shared_ptr<const T>OBJ)?

2)如下实例化类更好MyExample<const int> 吗?这看起来过于严格,因为我永远无法回归shared_ptr<int>

c++ const shared-ptr

42
推荐指数
4
解决办法
3万
查看次数

在条件或循环中分配智能指针

我正在更新一些pre c ++ 11代码以使用c ++ 11 unique_ptrs.

我不确定如何处理的一件事是旧代码使用指针赋值作为条件.例如

Object* obj;
while ( obj = C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT() )
{
   // do something with obj
   delete obj;
}
Run Code Online (Sandbox Code Playgroud)

鉴于std :: unique_ptr :: reset没有返回值,因此无法将其直接转换为:

std::unique_ptr< Object > obj;
while ( obj.reset( C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT() ) )
{
   // do something with obj
}
Run Code Online (Sandbox Code Playgroud)

那么,升级此代码以使用unique_ptrs的最简洁方法是什么?我能想到的最好的是:

std::unique_ptr< Object > obj;
obj.reset(  C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT() );
while ( obj )
{
   // do something with obj
   obj.reset(  C_LIBRARY_CALL_WHICH_RETURNS_NEW_OBJECT() );
}
Run Code Online (Sandbox Code Playgroud)

但这增加了对库函数的混乱双重调用,理想情况下我想避免.

c++ unique-ptr c++11

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

VS Code 在工作区中找不到自己的 python 模块

我正在使用 VS Code 开发一个 python 包,其在 VS Code 中打开的工作区文件夹的布局如下

workspace
| + tests
| | - test1.py
| | + other_tests
| | | - test2.py 
| + mymodule
| | ...
Run Code Online (Sandbox Code Playgroud)

我想要的是打电话进来test1.py并带test2.py包裹mymodule

import mymodule
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我总是收到错误no module named 'mymodule'。我知道我可以通过将以下内容插入到所有测试文件来加载路径:

import sys
sys.path.append('<path_to>/workspace/')
Run Code Online (Sandbox Code Playgroud)

然后mymodule就可以正确加载了。(我知道我可以使用pathlib.Path(__file__).parent[n]一些n来获得<path_to>.

但如果你在不同的文件夹中有很多测试文件,这个过程真的很麻烦......而且它很丑陋。

有什么方法可以告诉 VS Code 始终将 包含workspace在路径中吗?

我尝试了一个.env文件

PYTHONPATH=<path_to>/workspace/
Run Code Online (Sandbox Code Playgroud)

我还尝试将以下内容添加到launch.json

"env": { "PYTHONPATH": "${workspaceFolder}" }
Run Code Online (Sandbox Code Playgroud)

两者都没有达到目的。(我也不确定这是否PYTHONPATH …

python pythonpath visual-studio-code

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

从相同的硬编码字符串文字初始化 std::string 和 std::wstring

当我偶然发现一个场景时,我正在编写一些单元测试,这个场景已经困扰了我几次。

我需要生成一些字符串来测试 JSON writer 对象。由于作者支持 UTF16 和 UTF8 输入,我想用这两种输入来测试它。

考虑以下测试:

class UTF8;
class UTF16;

template < typename String, typename SourceEncoding >
void writeJson(std::map<String, String> & data)
{
    // Write to file
}

void generateStringData(std::map<std::string, std::string> & data)
{
    data.emplace("Lorem", "Lorem Ipsum is simply dummy text of the printing and typesetting industry.");
    data.emplace("Ipsum", "Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type …
Run Code Online (Sandbox Code Playgroud)

c++ string unicode

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

检测模板类型本身是模板类型

我正在编写一个负责格式化和打印信息的方法.

有一个问题/功能boost::optional<T>,当输出到流时,只有当有值时才会输出额外的空格optional.

我可以看到两个选项:

  • 使用两个不同的功能:一般和一个明确处理 boost::optional<T>
  • 使用单个函数可以检测参数是否为类型boost::optional<T>并相应地处理它

选项1可能是这样的:

template <typename T>
void print(const T& o)
{
    std::cout << o << "\n";
}

template <typename T>
void print_optional(const boost::optional<T>& o)
{
    if (o)
        print(*o);
    else 
        print("--");
}
Run Code Online (Sandbox Code Playgroud)

它有效,但它有一个问题,如果我们调用print()一个没有编译错误boost::optional.我知道static_assert并且std::is_type,但由于boost::optional本身是模板化的,我不知道如何检查它.

选项2对我来说是理想的,但问题仍然存在:如何询问代码变量boost::optional<T>是否与T无关?

c++ templates boost types

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

clock()在调试版上运行良好但在发布时不起作用(C++ VS2010)

这是我的代码:

// Start performance test clock
assert((start=clock())!=-1);

// Some reading and writing methods

// Get stop time
stop = clock();

cout << stop << endl;

// Calculate operation time
double result = (double)(stop-start)/CLOCKS_PER_SEC;

// Print result
cout << "--> Finished analysing in " << result << "s" << endl;
Run Code Online (Sandbox Code Playgroud)

我调试程序时效果很好,但是当我运行发布版本时,stop会收到比start更小的值,结果是负数.

有任何想法吗?

c++ release timer clock

2
推荐指数
1
解决办法
567
查看次数

错误C3861:'system':找不到标识符

我刚刚win32在VS 2010中启动了一个新的控制台应用程序,并将Additional options属性设置precompiled header为即将到来的向导.

基于我以前的一个问题,我决定使用以下主要原型:

int main(int argc,  char* argv[])
Run Code Online (Sandbox Code Playgroud)

我还将Character Set项目的属性更改为Use Multi-Byte Character Set.

但是,以下代码:

system("pause");
Run Code Online (Sandbox Code Playgroud)

会产生这两个错误:

error C3861: 'system': identifier not found  
IntelliSense: identifier "system" is undefined
Run Code Online (Sandbox Code Playgroud)

我之前有过相同的经历,没有错误!
谁能告诉我什么是错的?

c++ intellisense system identifier visual-studio-2010

2
推荐指数
1
解决办法
4万
查看次数