小编Moo*_*ice的帖子

这是C++'move'语义的正确用法吗?

今晚我一直在看一些我过去几天一直在研究的代码,并开始阅读移动语义,特别是std :: move.我有几个问题要求专业人士确保我走正确的道路而不做任何愚蠢的假设!

首先:

1)最初,我的代码有一个返回大向量的函数:

template<class T> class MyObject
{
public:
    std::vector<T> doSomething() const;
    {
        std::vector<T> theVector;

        // produce/work with a vector right here

        return(theVector);
    }; // eo doSomething
};  // eo class MyObject
Run Code Online (Sandbox Code Playgroud)

鉴于"theVector"在这个和"扔掉"中是暂时的,我将该函数修改为:

    std::vector<T>&& doSomething() const;
    {
        std::vector<T> theVector;

        // produce/work with a vector right here

        return(static_cast<std::vector<T>&&>(theVector));
    }; // eo doSomething
Run Code Online (Sandbox Code Playgroud)

它是否正确?这样做有什么陷阱吗?

2)我在一个函数中注意到它返回std::string它自动调用移动构造函数.调试返回字符串(thankyou,Aragorn),我注意到它称为显式移动构造函数.为什么有一个字符串类而不是矢量?

我没有必要对此函数进行任何修改以利用移动语义:

// below, no need for std::string&& return value?
std::string AnyConverter::toString(const boost::any& _val) const
{
    string ret;
    // convert here
    return(ret); // No …
Run Code Online (Sandbox Code Playgroud)

c++ c++-standard-library move-semantics c++11

33
推荐指数
4
解决办法
1万
查看次数

移动构造函数调用基类Move Constructor

我有一个基类,它基本上将一个类附加到任意窗口句柄(例如,HWND,HFONT),并使用策略类来附加/分离和销毁:

// class SmartHandle
template<typename THANDLE, class TWRAPPER, class TPOLICY>
class SmartHandle : boost::noncopyable
{
private:
    TPOLICY*  m_pPolicy;    // Policy
    bool m_bIsTemporary;    // Is this a temporary window?

    SmartHandle();  // no default ctor
    SmartHandle(const SmartHandle<THANDLE, TWRAPPER, TPOLICY>&);    // no cctor
protected:
    THANDLE   m_hHandle;    // Handle to the underlying window

    TPOLICY& policy() {return(*m_pPolicy);};

    // ctor that attaches but is temporary
    SmartHandle(const THANDLE& _handle, bool _temporary) : m_hHandle(_handle)
                                                         , m_bIsTemporary(_temporary)
    {
        m_pPolicy = new TPOLICY(reinterpret_cast<TWRAPPER&>(*this));
        if(_handle)
            m_pPolicy->attach(_handle);
    };  // eo ctor

    // …
Run Code Online (Sandbox Code Playgroud)

c++ templates move-constructor c++11

14
推荐指数
3
解决办法
6532
查看次数

矢量std :: function <>

说要存储以下内容:

typedef std::function<void(int)> MyFunctionDecl;
Run Code Online (Sandbox Code Playgroud)

..收藏:

typedef std::vector<MyFunctionDecl> FunctionVector;
FunctionVector v;
Run Code Online (Sandbox Code Playgroud)

这是可能的,但如果我想找到一些东西std::find:

FunctionVector::const_iterator cit = std::find(v.begin(), v.end(), myFunctionDecl);
Run Code Online (Sandbox Code Playgroud)

..由于==操作员我们得到错误.

正如我之前在此问题中向我提出的那样,可以通过将函数声明封装在另一个类中来解决这个问题,该类提供了一个==运算符:

class Wrapper
{
private:
    MyFunctionDecl m_Func;

public:
    // ctor omitted for brevity

    bool operator == (const Wrapper& _rhs)
    {
         // are they equal?
    }; // eo ==
};  // eo class Wrapper
Run Code Online (Sandbox Code Playgroud)

所以我想要做的是以某种方式生成"MyFunctionDecl"的哈希,以便我可以正确实现==运算符.我可以拥有某种唯一标识符,并要求调用者为委托提供唯一标识符,但这看起来有点痛苦并且容易出错.

有没有办法可以做到这一点?为了比较的目的,相同的函数将返回相同的ID?到目前为止,绕过它的唯一方法是抛弃使用的概念std::function并返回使用支持比较的快速代理.但后来我失去了使用lambdas的能力.

任何帮助赞赏!

编辑

鉴于下面的答案,这就是我想出的......我可能错过的任何警告?我现在正在通过它的步伐:

class MORSE_API Event : boost::noncopyable
{
public:
    typedef std::function<void(const EventArgs&)> DelegateType;
    typedef …
Run Code Online (Sandbox Code Playgroud)

c++ hash function c++11

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

检测调试器是否已连接*和*单步执行

我知道的Debugger在类内System.Diagnostics拥有命名空间IsAttached属性.

在某个地方是否有一个属性可以增加这个调用并告诉我,如果我们实际上是在单步执行代码,而不仅仅是简单地附加?我知道这可能不太可能,但知道它会很有用.

编辑

也许是一个更好的问题,而不是"踩踏"运行一些代码:

  1. 当调试器第一次"中断"时(进入调试模式,附加后)
  2. 当它再次运行时(但仍然附着,但不是"踩踏").

.net c# debugging visual-studio-debugging

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

boost :: asio,线程和同步

这与这个问题有些相关,但我想我需要多了解一点.我一直试图让我的头脑在几天内完成这项工作(同时处理其他部分),但现在是时候咬紧牙关并获得多线程了.另外,我提供的信息比链接的问题要多一些.

首先,关于多线程.因为我一直在测试我的代码,所以我没有烦恼任何多线程.它只是一个控制台应用程序,它启动与测试服务器的连接,然后处理其他所有内容.主循环是这样的:

while(true)
{
    Root::instance().performIO(); // calls io_service::runOne();
}
Run Code Online (Sandbox Code Playgroud)

当我编写我的主应用程序时,我猜这个解决方案是不可接受的(因为它必须在消息循环中调用,尽管可能,当消息队列阻塞等待消息时会出现问题.你可以更改它,以便消息循环不会阻止,但那不会打破通过屋顶的CPU使用率吗?)

似乎解决方案是抛出另一个线程.好的.但是当我io_service::run()没有工作要做的时候,我已经阅读了这些回报.那是什么?那是没有数据,还是没有连接?如果至少存在一个连接,它是否仍然存活?如果是这样,那就不是问题了,因为我只需要在第一次连接时启动一个新线程,如果在没有任何事情发生时全部停止,我很高兴.我想我对"没有工作要做"的定义感到困惑.

然后我不得不担心我的boost线程与我的主GUI线程同步.所以,我想我的问题是:

  1. 在客户端应用程序中使用boost :: asio关于线程并保持它们活着的最佳实践方法是什么?
  2. 从主线程写入套接字到IO线程时,是否使用了同步boost::asio::post,以便稍后在io_service中进行调用?
  3. 收到数据后,人们如何将数据恢复到UI线程?在过去,当我使用完成端口时,我做了一个特殊事件,可以使用:: SendMessage将数据发布回主UI线程.它不优雅,但它起作用.

今天我会再读一些,但是从已经做过这件事的人那里得到一个很好的帮助会很棒.Boost :: asio文档并不是很好,到目前为止我的大部分工作都是基于一些文档,一些试验/错误,网上的一些示例代码.

c++ boost boost-asio

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

P/Invoke,c#:unsigned char丢失一个字节

我正在努力为软件SDK的DLL文件,我试图调用一个函数来获取有关软件主机的信息.

在函数想要的结构中有两个unsigned char变量(HostMachineAddress,HostProgramVersion),当我尝试从c#调用它时,我似乎"松散"了最后一个字节...如果我将下面的c#struct中的SizeConst更改为5我确实得到了丢失的字节,但是它导致另一个变量丢失了数据.

有人可以帮我找到解决这个问题的方法吗?也尝试使用类而不是struct导致system.stackoverflow错误

C#Struct

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct sHostInfo
{
    public int bFoundHost;
    public int LatestConfirmationTime;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
    public string szHostMachineName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
    public string HostMachineAddress;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
    public string szHostProgramName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
    public string HostProgramVersion;
}
Run Code Online (Sandbox Code Playgroud)

C#

[DllImport("Cortex_SDK.dll")]
public static extern int GetHostInfo(out sHostInfo pHostInfo);
Run Code Online (Sandbox Code Playgroud)

c# pinvoke marshalling unsigned-char

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

符号<>在MSIL中的含义是什么?

反编译后我有这个代码

    SampleClass sampleClass;
    SampleClass <>g__initLocal0;
    int y;
    sampleClass = null;
Label_0018:
    try
    {
        <>g__initLocal0 = new SampleClass();
        <>g__initLocal0.X = 5;
        <>g__initLocal0.Y = 10;
        sampleClass = <>g__initLocal0;
        goto Label_003A;
    }
    catch (Exception)
    {
    Label_0035:
        goto Label_003A;
    }
Label_003A:
    y = sampleClass.Y;
Run Code Online (Sandbox Code Playgroud)

在某些操作之前,我不知道操作符/符号<>是什么意思.有人知道吗?

.net c# cil

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

从字符串/ boost :: any map构建boost :: options

我有一张代表配置的地图.这是地图std::stringboost::any.

此映射在开始时初始化,我希望用户能够在命令行上覆盖这些选项.

我喜欢做的是使用该options_description::add_option()方法从此地图构建程序选项.但是,它需要一个模板参数,po::value<>而我只有boost::any.

到目前为止,我只是拥有代码的shell. m_Config代表我的配置类,并getTuples()返回一个std::map<std::string, Tuple>. TuplePair是一个typedef std::pair<std::string, Tuple>和Tuple包含boost::any我感兴趣的.

    po::options_description desc;
    std::for_each(m_Config.getTuples().begin(),
                  m_Config.getTuples().end(),
                  [&desc](const TuplePair& _pair)
    {
            // what goes here? :)
            // desc.add_options() ( _pair.first, po::value<???>, "");
    });
Run Code Online (Sandbox Code Playgroud)

有没有办法以这种方式构建它,还是我需要自己去做?

提前致谢!

c++ boost-program-options boost-any

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

抛出什么类型的异常

当用于返回值的对象为null时,您将从readonly属性抛出什么类型的异常

public class TestClass
{
    SomeObject obj;
    public string NameOfObject 
    {
       get 
       {
            if(obj == null)
            { // what exception type to throw here  }
            return obj.Name;
       }
}
Run Code Online (Sandbox Code Playgroud)

c# exception

8
推荐指数
2
解决办法
2593
查看次数

Url.Action不包括端口号

我有一个部分视图显示在非HTTPS页面上,但POSTS显示在需要SSL的控制器上.表单定义如下:

        <form id="authForm"
          method="post"
          action="@Url.Action("authenticate", "auth", new {}, "https")">
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,在Visual Studio中和调试时,主机和端口是localhost:64043.但是,Url.Action上面的调用不会将端口号放入,这意味着浏览器会指向我的IIS安装.我是否必须添加其他内容,或覆盖此方法?我希望我的应用程序与位置无关.

提前致谢!

c# https asp.net-mvc-3

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