我在类中有一些容器,例如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>?
我正在更新一些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)
但这增加了对库函数的混乱双重调用,理想情况下我想避免.
我正在使用 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 …
当我偶然发现一个场景时,我正在编写一些单元测试,这个场景已经困扰了我几次。
我需要生成一些字符串来测试 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) 我正在编写一个负责格式化和打印信息的方法.
有一个问题/功能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无关?
这是我的代码:
// 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更小的值,结果是负数.
有任何想法吗?
我刚刚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++ ×6
boost ×1
c++11 ×1
clock ×1
const ×1
identifier ×1
intellisense ×1
python ×1
pythonpath ×1
release ×1
shared-ptr ×1
string ×1
system ×1
templates ×1
timer ×1
types ×1
unicode ×1
unique-ptr ×1