这是我的情况:
template<typename T, typename F>
inline
auto do_with(T&& rvalue, F&& f) {
auto obj = std::make_unique<T>(std::forward<T>(rvalue));
auto fut = f(*obj);
return fut.then_wrapped([obj = std::move(obj)] (auto&& fut) {
return std::move(fut);
});
}
Run Code Online (Sandbox Code Playgroud)
我想确保模板参数F&& f只接受非const左值引用.我应该如何强制执行此操作?
在Windows和Linux下用C++开发的程序有什么区别?
为什么不能在Linux下使用在C++下用Windows开发的程序?
例如,我想T只在它是std::is_pointer<T>和时使用类型std::is_const<T>.
当然,有这样简单的方法:
template <typename T>
void f(T t, std::true_type, std::true_type) {}
template <typename T>
void f(T t)
{
f(t, std::is_pointer<T>{}, std::is_const<T>{});
}
Run Code Online (Sandbox Code Playgroud)
但是我想要这样的东西:
template <typename T>
void f(T t, std::true_type) {}
template <typename T>
void f(T t)
{
f(t, std::and<std::is_pointer<T>, std::is_const<T>>{});
}
Run Code Online (Sandbox Code Playgroud)
在c ++标准类中是什么样的true_type?如果不是,是否有任何简单的方法来实现它,具有所需的功能?
我一直在阅读代码,QScopedPointer并发现了一些我无法理解的东西.
这是QScopedPointercode.qt.io 上的相关代码:
template <typename T, typename Cleanup = QScopedPointerDeleter<T> >
class QScopedPointer
{
typedef T *QScopedPointer:: *RestrictedBool;
public:
...
#if defined(Q_QDOC)
inline operator bool() const
{
return isNull() ? Q_NULLPTR : &QScopedPointer::d;
}
#else
inline operator RestrictedBool() const
{
return isNull() ? Q_NULLPTR : &QScopedPointer::d;
}
#endif
...
inline bool isNull() const
{
return !d;
}
...
protected:
T *d;
Run Code Online (Sandbox Code Playgroud)
我理解使QDoc认为QScopedPointer具有的预处理器定义operator bool而不是operator RestrictedBool.我不明白它的用途RestrictedBool是什么以及它是如何做到的.例如,更简单的实现是:
inline operator bool() const …Run Code Online (Sandbox Code Playgroud) 有没有人有使用继承减少模板代码膨胀的经验?
我犹豫以这种方式重写我们的容器:
class vectorBase
{
public:
int size();
void clear();
int m_size;
void *m_rawData;
//....
};
template< typename T >
class vector : public vectorBase
{
void push_back( const T& );
//...
};
Run Code Online (Sandbox Code Playgroud)
我应该保持最大的性能,同时减少编译时间
我也想知道为什么stl实现不使用这种方法
感谢您的反馈
有没有办法获取文件的系统上下文菜单?
我需要从系统菜单中获取所有命令,不仅包括复制/粘贴/重命名等简单操作,还包括一些非标准操作,如Dropbox操作.
我在Windows上使用Qt 5.x,但Mac OS的解决方案也很有用.如果答案需要独立于Qt的库,那也没问题.
这个问题是C++17的后续问题:仍然使用枚举作为常量?.
遗留常量有多种形式,特别是:
#define CONSTANT xenum { CONSTANT = x };const /*int/unsigned/whatever*/ CONSTANT = x;关于static constexpr和inline constexpr常量作为替代的评论让我想到了更新我们许多遗留常量(特别是#define常量)的主题。
据我了解,一个inline constexpr值基本上只是被替换了,就像一个内联函数(我已经被证明是错误的)。相反,一个static constexpr值作为二进制的一部分存储在一个单独的区域中。假设我理解正确,什么时候应该优先选择另一个?我的预感是,对于积分常数,inline constexpr通常是首选。
我正在尝试实现一个模板类(此处名为Get <>),给定结构H,如果不存在,则类型Get<>为H自身Get<H>::type H,H::der否则为.我无法理解以下代码有什么问题:
#include <iostream>
#include <typeinfo>
using namespace std;
template<class U, class V = void>
struct Get
{
static const char id = 'A';
typedef U type;
};
template<class U>
struct Get<U,typename U::der>
{
static const char id = 'B';
typedef typename Get<typename U::der>::type type;
};
struct H1
{ };
struct H2
{ typedef double der; };
struct H3
{ typedef void der; };
struct H4
{ typedef H2 der; }; …Run Code Online (Sandbox Code Playgroud) 我很好奇继承在非多态类中的影响.具体来说,我正在编写两个智能指针类,既没有虚拟方法,也有非常独特的用途.由于基本运算符重载并且某些标准函数是相同的,并且它们只需要一个成员变量,我想我可以使用基类来重用代码.这是我的意思的简单模型:
基类:
template <class T>
class Pointer_Impl
{
public:
T & operator*() { return this->*m_pointer; }
// etc.
protected:
T *m_pointer;
//protected to prevent instantiation without using = delete
Pointer_Impl() {}
Pointer_Impl(T *) {}
//other constructors, assignment and move operators, destructor here
};
Run Code Online (Sandbox Code Playgroud)
然后:
template <class T>
class PointerA : public Pointer_Impl<T>
{
public:
PointerA() { m_pointer = nullptr; }
PointerA(T * obj) { m_pointer = obj; }
// other constructors, assignment and move …Run Code Online (Sandbox Code Playgroud) 我注意到 AVR 的 gcc 落后于 gcc 的主要开发流程。例如,AVR8 的 gcc 在 Atmel Studio 7 和 Arduino 中为 4.9.2,AVR32 在 Atmel Studio 中为 4.4.7。同时,gcc 4.9.4 是当前的 4.9 版本,开发正在推动多个分支 5.x、6.x 和 7.x ( https://gcc.gnu.org/develop.html )。
更新(2019 年 11 月): Atmel Studio 和 Arduino 工具链现已升级至 gcc 5.4,但仍仅完全实现 C++11。
我担心的是,通过将 C++ 语言最近添加的功能与较旧的编译器一起使用,我可能会遇到早期实现问题。此外,gcc 中 AVR 支持的开发过程尚不清楚。
我正在写一个可移动的QScopedPointer;基本上std::unique_pointer有一些额外的访问器。我在访问 C++11 兼容编译器之前就开始了它,但现在我决心把它做好(即使我在重新发明轮子)。
让我们调用我的智能指针MyUniquePointer。
我需要知道 type 是否U *可以T *通过 a转换为 type static_cast,特别是:
template<class T, class Cleanup>
class MyUniquePointer
{
...
template<class U, class CleanupU, class = std::enable_if_t<detail::is_safely_castable<U, T>()>
MyUniquePointer(MyUniquePointer<U, CleanupU> && other) noexcept
: d(static_cast<T *>(other.release()))
{}
...
Run Code Online (Sandbox Code Playgroud)
我的第一次尝试是static_cast在 an 内部使用enable_if,但您不能使用 的地址std::declval()来获取static_cast!
如果指向的指针U可以static_cast指向T使用模板魔术的指针,有没有办法使用测试?
基于cppreference和这个答案,我尝试创建一个模板测试来模拟 static_cast 何时合法,如果向下转换,则安全 …
QProcess process_sdcompare;
QString command_sdcompare;
QStringList args_sdcompare;
command_sdcompare = "diff";
args_sdcompare << "Filename" << "Filename";
process_sdcompare.start(command_sdcompare,args_sdcompare,QIODevice::ReadOnly);
process_sdcompare.waitForFinished();
QString StdOut_sdcompare = process_sdcompare.readAllStandardOutput(); //Reads standard output
QString StdError_sdcompare = process_sdcompare.readAllStandardError(); //Reads standard error
if(StdOut_sdcompare.isEmpty()) //the process output is checked here if empty it is a success
return 1;
Run Code Online (Sandbox Code Playgroud)
我正在运行上面的代码.当我在比较不相似的文本文件后检查错误情况时,isEmpty()返回false.
如何检查QProcess执行是否没有错误?
c++ ×12
templates ×4
qt ×3
c++11 ×2
inheritance ×2
linux ×2
type-traits ×2
atmelstudio ×1
avr ×1
c++14 ×1
c++17 ×1
constants ×1
constexpr ×1
contextmenu ×1
gcc ×1
qt5 ×1
sfinae ×1
static-cast ×1
windows ×1