小编met*_*tal的帖子

将std :: unique_ptr <Derived>转换为std :: unique_ptr <Base>

假设我有处理基类和派生类的工厂函数:

#include <memory>

using namespace std;

struct B { virtual ~B() {} };
struct D : B {};

unique_ptr<B> MakeB()
{
    auto b = unique_ptr<B>( new B() );
    return b; // Ok!
}

unique_ptr<B> MakeD()
{
    auto d = unique_ptr<D>( new D() );
    return d; // Doh!
}
Run Code Online (Sandbox Code Playgroud)

在上面的最后一行,我需要move(d)为了使它工作,否则我得到"错误:无效转换std::unique_ptr<D>std::unique_ptr<D>&&." 我的直觉说,在这种情况下,编译器应该知道它可以隐式地创建d一个rvalue并将其移动到基指针中,但事实并非如此.

这在我的编译器(gcc 4.8.1和VS2012)中是不可靠的吗?预期的设计unique_ptr?标准有缺陷吗?

c++ unique-ptr c++11 c++14

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

如何阻止我的安装程序触发Windows 10"此应用程序已被阻止以保护您的"错误?

Windows 10的安全功能有时会阻止我的应用程序安装程序不受信任,并说"此应用程序已被阻止以保护您的安全".(我的安装程序已经过数字签名.)最终用户可以使用解决方法,但这不是一个好的用户体验.

从公司网站下载后,Windows 10应该如何信任我的应用程序?

windows security installer windows-10

14
推荐指数
2
解决办法
2551
查看次数

在不同的GUI类(菜单,工具栏等)之间共享操作的最佳方法是什么?

我有几组动作(例如,复制,粘贴,撤消,重做,显示可停靠窗口XYZ,缩放等),我不想在多个位置复制但由GUI的不同部分共享,如主菜单,工具栏和右键菜单.

分享它们的最佳方式是什么?我正在使用Qt 5.3和C++,但这主要是独立于任何特定的GUI框架或语言.

一些可能性:

  1. 指定一个中心位置,比如主窗口,用文本,图标和回调创建所有这些位置.然后:

    1. 在创建GUI的子组件时将操作传递给构造函数.这可以使构造函数参数列表相当长.

    2. 在构造子组件之后,在GUI的子组件上调用setter,并传递所有必要的操作.这使得构造函数更短,但最终并不是更漂亮.

    3. 从主窗口提供getter并让子组件获得他们想要的操作.子组件通常具有指向主窗口的指针.这使得主窗口不知道谁在乎哪个动作,但它也暴露了一堆公共成员(除非我使用律师 - 客户成语或类似的).

    4. 将它们添加到一个单独的全局存储库,其中主窗口添加它们,用户根据需要按名称或键或其他内容查找它们.这与其他选项类似,但将关注点分开一点,并且只公开一个参数化的getter而不是一堆特定的getter.缺点:这会添加一个每个人都可以访问的全局对象.

  2. 在"主"用例中定义操作,比如主菜单,然后为其他人使用getter.这将它们定位在一个地方,并且意味着主窗口需要为主菜单提供单个getter功能.但它仍然将一大堆内部成员公开.

什么是最好的方法?我还没有列出更好的东西吗?

c++ oop user-interface qt qt5

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

检测函数对象(仿函数)和lambda特征

如何检测nullary和unary函数指针,std :: function对象和functor(包括lambdas)的返回类型和参数类型?

Boost的function_traits功能特性并没有让我开箱即用,但我愿意补充或替换它们.

我可以这样做:

namespace nsDetail
{
    class Dummy { Dummy(); };
}

template<class Fn> struct FnTraits;

template<class R>
struct FnTraits<R(*)()>
{
    typedef nsDetail::Dummy ParamType;
    typedef R               ReturnType;
    typedef R Signature();
};

template<class R, class P>
struct FnTraits<R(*)(P)>
{
    typedef P ParamType;
    typedef R ReturnType;
    typedef R Signature( P );
};

template<class R>
struct FnTraits< std::function<R()> >
{
    typedef nsDetail::Dummy ParamType;
    typedef R               ReturnType;
    typedef R Signature();
};

template<class R, class P>
struct FnTraits< std::function<R(P)> …
Run Code Online (Sandbox Code Playgroud)

c++ lambda function-pointers functor function-object

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

CII/CLI中的RAII

我已经习惯了C++ RAII工具,我想以正确的方式使用RAII和C++/CLI中的托管代码.Herb Sutter微软都告诉我这是最好的做法.

我有这样的事情:

ref struct Managed
{
    // No default constructor
    Managed( /*...*/ ) { /*...*/ }
    ~Managed() { /* Important non-managed resource release here */ }
    // ...
};

ref struct UsesManaged
{
    Managed^         m_;
    array<Managed^>^ a_;

    UsesManaged( Managed^ m, array<Managed^>^ a ) : m_(m), a_(a) {}
    // ...
};

ref struct Creator
{
    Managed^         m_;
    array<Managed^>^ a_;
    UsesManaged^     u_;

    Creator()
    {
        // Must allocate dynamically here, not in initializer list
        // because in …
Run Code Online (Sandbox Code Playgroud)

c++-cli smart-pointers

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

使用std :: function进行隐式转换

可能重复:
为什么我的C++编译器不能推导出boost函数的模板参数?
std :: function的模板参数(签名)是不是它的类型?

我有以下内容:

#include <functional>

void Foo( std::function<void()>    );
void Foo( std::function<void(int)> );
void Bar();

int main()
{
  Foo( Bar );     // Error: ambiguous
  Foo( [](){} );  // Error: ambiguous

  Foo( std::function<void()>( Bar    ) ); // Ok
  Foo( std::function<void()>( [](){} ) ); // Ok
}
Run Code Online (Sandbox Code Playgroud)

我可以在main()中使用前两行而不使用最后两行中的函数样式转换吗?也许使用std :: enable_if解决方案?

c++ overloading implicit-conversion c++11

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

C++在VS2010中使用lambda参数捕获嵌套了lambda错误?

我正在使用Visual Studio 2010,它显然在lambdas上有一些错误的行为,并且有这个嵌套的lambda,其中内部lambda返回包裹为std :: function的第二个lambda(参见MSDN上的"高阶Lambda函数")):

int x = 0;
auto lambda = [&]( int n ) 
{ 
    return std::function<void()>( 
        [&] // Note capture
        { 
            x = n; 
        } 
    ); 
};

lambda( -10 )(); // Call outer and inner lambdas

assert( -10 == x ); // Fails!
Run Code Online (Sandbox Code Playgroud)

这编译但在断言失败.具体来说,内部lambda中的n是未初始化的(0xCCCCCCCC),但x被成功修改为其值.如果我将内部lambda的capture子句更改为"[&,n]",则断言按预期传递.这是VS2010的一个错误还是我不明白lambda捕获是如何工作的?

c++ lambda visual-studio-2010 c++11

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

在库的公共API中转换远离std :: string,std :: ostream等

对于在许多工具链API/ABI兼容性与相同的二进制,这是很好 众所周知 的是 STL容器,std::string和其他标准库类,如输入输出流被禁止的公共报头.(例外情况是,如果为每个受支持的工具链版本分配一个构建;一个为最终用户编译提供没有二进制文件的源,在本例中不是首选选项;或者一个转换为其他一些内联容器,以便不同的std实现不会被库提取.)

如果已经有一个已发布的库API没有遵循此规则(请求朋友),那么最好的路径是什么,同时保持尽可能多的向后兼容性,并且我不能支持编译时断点?我需要支持Windows和Linux.

重新考虑我正在寻找的ABI兼容性水平:我不需要它是疯狂的未来证明.我主要是为每个版本的多个流行的Linux发行版只做一个库二进制文件.(目前,我为每个编译器发布一个,有时为特殊发行版(RHEL vs Debian)发布特殊版本.与MSVC版本相同的问题 - 所有支持的MSVC版本的一个DLL将是理想的.)其次,如果我不'在破解修复版本中打破API,我希望它与ABI兼容,并且无需重建客户端应用程序即可替换掉DLL/SO.

我有三个案例,有一些初步建议,模仿Qt到一定程度.

旧的公共API:

// Case 1: Non-virtual functions with containers
void Foo( const char* );
void Foo( const std::string& );

// Case 2: Virtual functions
class Bar
{
public:
    virtual ~Bar() = default;
    virtual void VirtFn( const std::string& );
};

// Case 3: Serialization
std::ostream& operator << ( std::ostream& os, const Bar& bar );
Run Code Online (Sandbox Code Playgroud)

案例1:带容器的非虚函数

从理论上讲,我们可以将std::string使用转换为非常类似于std::string_view我们库的API/ABI控件的类.它将在我们的库头中进行转换,std::string以便编译的库仍然接受但是独立于std::string实现并且向后兼容:

新API:

class …
Run Code Online (Sandbox Code Playgroud)

c++ c++-standard-library c++11 c++14

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

如何使clang格式尊重“类似表格”的代码格式

我有一些代码,其中的数据或参数表按如下所示的列对齐(人为的简单示例;实际代码具有更大的表):

//        Name    Size    Starting val
//        ======= ======= ============
S s = {
        { "Dubs", abc,    123 },
        { "X",    n,      m   },
        { "YZ",   ij / q, kl  } 
    };

//           Name    Size    Starting val
//           ======= ======= ============
w  = Create( "Dubs", abc,    123 );
x  = Create( "X",    n,      m   );
yz = Create( "YZ",   ij / q, kl  );
Run Code Online (Sandbox Code Playgroud)

clang-format杀死表格式:

//        Name    Size    Starting val
//        ======= ======= ============
S s = {
    { "Dubs", …
Run Code Online (Sandbox Code Playgroud)

c++ clang-format

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

C++ 14元编程:在编译/初始化时自动构建类型列表

使用C++ 14和奇怪的重复模板模式(CRTP)和可能的Boost.Hana(或者boost::mpl如果你愿意)的某种组合,我可以在编译时(或静态初始化时间)构建一个类型列表而不需要显式声明吗?

举个例子,我有类似的东西(见上Coliru):

#include <iostream>
#include <boost/hana/tuple.hpp>
#include <boost/hana/for_each.hpp>

namespace
{
    struct D1 { static constexpr auto val = 10; };
    struct D2 { static constexpr auto val = 20; };
    struct D3 { static constexpr auto val = 30; };
}

int main()
{
    // How to avoid explicitly defining this?
    const auto list = boost::hana::tuple< D1, D2, D3 >{}; 

    // Do something with list
    boost::hana::for_each( list, []( auto t ) { std::cout …
Run Code Online (Sandbox Code Playgroud)

c++ crtp template-meta-programming c++14 boost-hana

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

如何检测列表化的QDockWidget是否为活动选项卡

我在Qt 5.1应用程序中有多个dock小部件.我想知道哪个选项卡当前处于活动状态(当前它是否具有焦点),但我不知道如何以编程方式获取该信息.

我已经尝试过QWidget::IsVisible(),QWidget::IsVisibleTo()并检查返回的列表QMainWindow::tabifiedDockWidgets(),它排除了作为参数发送的小部件,因此无法提供订单.

有任何想法吗?

c++ qt qt5

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