小编Jon*_*per的帖子

如何强制函数仅接受左值引用参数

这是我的情况:

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左值引用.我应该如何强制执行此操作?

c++ templates

17
推荐指数
2
解决办法
2264
查看次数

在Windows和Linux下开发的C++程序之间的区别

在Windows和Linux下用C++开发的程序有什么区别?

为什么不能在Linux下使用在C++下用Windows开发的程序?

c++ linux windows

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

c ++如何从type_traits标准方式组合条件

例如,我想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?如果不是,是否有任何简单的方法来实现它,具有所需的功能?

c++ templates type-traits c++11

11
推荐指数
2
解决办法
2042
查看次数

QScopedPointer中运算符RestrictedBool的用途是什么?

我一直在阅读代码,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)

c++ qt qt5

11
推荐指数
1
解决办法
436
查看次数

通过继承减少模板膨胀

有没有人有使用继承减少模板代码膨胀的经验?

我犹豫以这种方式重写我们的容器:

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实现不使用这种方法

感谢您的反馈

c++ inheritance templates code-generation

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

如何在Qt中获取文件系统操作的上下文菜单?

有没有办法获取文件的系统上下文菜单?

我需要从系统菜单中获取所有命令,不仅包括复制/粘贴/重命名等简单操作,还包括一些非标准操作,如Dropbox操作.

我在Windows上使用Qt 5.x,但Mac OS的解决方案也很有用.如果答案需要独立于Qt的库,那也没问题.

c++ qt contextmenu

7
推荐指数
1
解决办法
714
查看次数

替换常量:何时使用静态 constexpr 和内联 constexpr?

这个问题是C++17的后续问题:仍然使用枚举作为常量?.

遗留常量有多种形式,特别是:

  • #define CONSTANT x
  • enum { CONSTANT = x };
  • const /*int/unsigned/whatever*/ CONSTANT = x;

关于static constexprinline constexpr常量作为替代的评论让我想到了更新我们许多遗留常量(特别是#define常量)的主题。

据我了解,一个inline constexpr值基本上只是被替换了,就像一个内联函数(我已经被证明是错误的)。相反,一个static constexpr值作为二进制的一部分存储在一个单独的区域中。假设我理解正确,什么时候应该优先选择另一个?我的预感是,对于积分常数,inline constexpr通常是首选。

c++ constants constexpr c++17

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

c ++递归类型特征

我正在尝试实现一个模板类(此处名为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)

c++ templates type-traits

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

在非多态继承中是否存在性能/内存使用影响?

我很好奇继承在非多态类中的影响.具体来说,我正在编写两个智能指针类,既没有虚拟方法,也有非常独特的用途.由于基本运算符重载并且某些标准函数是相同的,并且它们只需要一个成员变量,我想我可以使用基类来重用代码.这是我的意思的简单模型:

基类:

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)

c++ inheritance smart-pointers c++11

5
推荐指数
2
解决办法
254
查看次数

AVR gcc 版本 &lt; gcc 发行版本 -- 为什么?

我注意到 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 支持的开发过程尚不清楚。

  • gcc + AVR 工具链中是否添加了 C++ 语言的新功能?
  • 我可以将它们与 Atmel Studio 或 Arduino IDE 一起使用吗?

c++ gcc avr atmelstudio

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

使用 SFINAE 测试指针类型是否可以 static_cast 到另一个指针类型

背景

我正在写一个可移动的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 何时合法,如果向下转换,则安全 …

c++ sfinae static-cast c++14

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

如何检查QProcess是否正确执行?

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++ linux qt

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