我需要编写一个模板化函数,根据其参数的类别,它的行为会有所不同:
template<class ContainerType>
bool myFunc(ContainerType in){
//do some stuff
}
template<class NotAContainerType>
bool myFunc(NotAContainerType in){
//do something else
}
Run Code Online (Sandbox Code Playgroud)
我被限制在C++ 11中,所以static_if不在桌面上.此外,类的ContainerType和NotAContainerType非常大,并且可能在将来发生变化,因此只需手动添加一些例外作为模板特化也是不明智的.
我知道std::enable_if解决方法,但是如果我需要将它应用于两个相互不同的类集,我该如何使用它?
假设我有一个定义了复制和移动赋值运算符的对象。当我写下这个:
Object a(/*parameters 1*/);
/* some code */
a = Object(/*parameters 2*/);
Run Code Online (Sandbox Code Playgroud)
第三行很可能会调用移动赋值运算符。如何强制编译器使用复制赋值?相关地,如何强制复制移动构造函数?基本上我要求反向 std::move()
我为什么想要这个?
第 1 行和第 3 行之间的代码(我无法更改)获取一些指向 的字段的指针,即重要的是,不改变 的a内存布局(移动最有可能做的事情),而是用新值覆盖。a
此外,我的对象只是std::vector. 当我移动分配它时,编译器只会将其底层数组的指针重定向到右值向量的数组。当我复制分配它时(并且之前的向量a更长),那么它的底层数组将被覆盖,但它们的地址将保持不变。不幸的是,“某些代码”存储了像 之类的指针&a[2],并且它们可能不会改变。
关于新的C ++ 17并行算法如何管理线程有很好的参考吗?aka什么时候创建多少线程?是否为每个呼叫创建/销毁它们?
我想答案取决于所使用的编译器。因此,我对gcc的实现特别感兴趣。
当我写作
std::shared_ptr<MyType> x;
Run Code Online (Sandbox Code Playgroud)
使用指向nullptr的空共享指针初始化x.但我希望它能自动调用MyType的默认(或其他一些指定的构造函数).我知道,我可以写:
std::shared_ptr<MyType> x = std::maked_shared<MyTYpe>();
Run Code Online (Sandbox Code Playgroud)
但有时人们会忘记然后你遇到麻烦,所以编译器强制执行此操作会很好.
我想重新声明给定变量的类型,但是不幸的是rerequire_cast <>在这里没有帮助。这行:
reinterpret_cast<std::vector<double>>(std::string("Hello"));
Run Code Online (Sandbox Code Playgroud)
导致以下编译器错误:
invalid cast from type 'std::string {aka std::basic_string<char>}' to type 'std::vector<double>'
Run Code Online (Sandbox Code Playgroud)
有没有其他干净的方法?
笔记:
编辑/某些上下文:此行将是模板化函数的一部分,具有:
reinterpret_cast<T>(std::string())
Run Code Online (Sandbox Code Playgroud)
对于T == std :: string,这是完全可以的,但是不幸的是,编译器还将尝试为T == std :: vector <>实例化(但在运行时从不使用)它。这是C ++ 11,因此没有static_if。
c++ ×5
c++11 ×2
c++17 ×1
constructor ×1
enable-if ×1
move ×1
shared-ptr ×1
std ×1
templates ×1