小编Jor*_*ans的帖子

C++,'if'表达式中的变量声明

这里发生了什么?

if(int a = Func1())
{
    // Works.
}

if((int a = Func1()))
{
    // Fails to compile.
}

if((int a = Func1())
    && (int b = Func2()))
)
{
    // Do stuff with a and b.
    // This is what I'd really like to be able to do.
}
Run Code Online (Sandbox Code Playgroud)

2003标准中的6.4.3节阐述了在选择语句条件中声明的变量如何具有延伸到由条件控制的子语句末尾的范围.但是我没有看到它在什么地方说不能在括号内加上括号,也没有说明每种条件只有一个声明.

即使在需要条件中只有一个声明的情况下,这种限制也很烦人.考虑一下.

bool a = false, b = true;

if(bool x = a || b)
{

}
Run Code Online (Sandbox Code Playgroud)

如果我想在x设置为false的情况下输入'if"-body范围,则声明需要括号(因为赋值运算符的优先级低于逻辑OR),但由于括号不能使用,因此需要声明外部x身体,将声明泄露到比预期更大的范围.显然这个例子是微不足道的,但更现实的情况是a和b是函数返回需要测试的值

那么我想要做的是不符合标准,还是我的编译器只是破坏了我的球(VS2008)?

c++ if-statement compilation variable-declaration

104
推荐指数
5
解决办法
5万
查看次数

为什么std :: vector的构造函数接口是用C++ 11改变的?

为什么使用新标准删除了默认参数?我经常构造一个这样的矢量变量:std::vector<my_pod_struct> buf(100).我想我会用C++ 11编译器得到编译器错误.

explicit vector( size_type count,
                 const T& value = T(),                   /* until C++11 */
                 const Allocator& alloc = Allocator());
         vector( size_type count,
                 const T& value,                         /* since C++11 */
                 const Allocator& alloc = Allocator());
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

虚拟析构函数必须公开吗?

我发现几乎每个虚拟析构函数的代码片段都将它作为公共成员函数,如下所示:

class Base
{
public:
    virtual ~Base()
    {
        cout << "~Base()" << endl;
    }
};
class Derived : public Base
{
public:
    ~Derived()
    {
        cout << "~Derived()" << endl;
    }
};
Run Code Online (Sandbox Code Playgroud)

虚拟析构函数必须是公共的还是存在非公共虚拟析构函数有意义的情况?

c++ destructor

16
推荐指数
2
解决办法
8916
查看次数

如何将boost :: shared_ptr <>转换为引用(&)?

所以我有一个类使用带有函数的引用(&)

void request(tcp::socket& socket); 
Run Code Online (Sandbox Code Playgroud)

我正在开始迁移我的所有代码,boost::shared_ptr<tcp::socket>但我真的想知道如何将我的shared_ptrs转换为引用,以便能够使我的代码逐个函数进行逐步演变,而不是在一次迭代中将我所有的全部变为shared_ptr.那么如何将shared_ptr转换为引用呢?

c++ boost pointers reference

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

C++(标准)例外和Unicode

我遇到了一个我正在处理unicode字符串的问题,我想用标准异常做一些错误报告.标准异常中包含的错误消息不是unicode.

通常已经不是一个问题了我,因为我可以定义非Unicode的错误信息,并有足够的信息,但在这种情况下,我想包括从原始字符串的数据,而这些可能是Unicode.

如何处理异常中的unicode消息?您是否创建了自己的自定义异常类,是否从将它们扩展为unicode的标准异常派生,或者您是否有其他解决此问题的方法(例如规则"不在异常中使用unicode")?

c++ unicode exception

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

DLL-导出模板基类的静态成员

在DLL中,我有一个带有模板基类的导出的非模板类.此模板基类具有静态成员变量.我在可执行文件中使用静态基本成员,该可执行文件使用导出的非模板类链接到DLL.

在许多情况下,我得到了未解决的外部符号或关于不一致链接的抱怨.我发现一个有效的方案,但它似乎是kludgey所以我想知道是否有更好的方法,如果更好的方式也可能指向VS2010 SP1的C++编译器/链接器的缺陷.

这是我可以提炼的DLL的最小场景 - 我不认为我可以在不破坏场景的情况下删除任何内容.

// Header file
template<typename T>
class _MYDLL_EXPORTS TBaseClass
  {
  public:
    static const double g_initial_value;
  };

class _MYDLL_EXPORTS MyClass : public TBaseClass<MyClass>
  {    
  };

// Kludge: use this code only when building the DLL, not when including
// from the DLL's client
#ifdef _MYDLL
  template<typename T>
  const double TBaseClass<T>::g_initial_value = 1e-5;
#endif


// CPP file
#include "header.h"
// Explicit instantiation of the template for the correct parameter.
template class TBaseClass<MyClass>;
Run Code Online (Sandbox Code Playgroud)

然后是DLL的用户

#include <header.h>  
#include <iostream> …
Run Code Online (Sandbox Code Playgroud)

c++ windows templates visual-studio-2010

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

如何在类定义中定义的模板成员函数中使用显式模板实例化?

为了减少大量项目中自由使用模板的编译时间,我使用"extern模板"(显式模板实例化)来防止在许多不同的编译单元中定义公共模板函数.

但是,有一件令人讨厌的事情是它不适用于类定义中定义的成员函数.

例如,我有以下模板类:

template <typename T>
struct Foo
{
    static T doubleIt(T input)
    {
        return input * 2;
    }
};
Run Code Online (Sandbox Code Playgroud)

现在,我知道Foo最常用于数字类型,所以我将它添加到标题:

extern template struct Foo<int>;
extern template struct Foo<float>;
extern template struct Foo<double>;
Run Code Online (Sandbox Code Playgroud)

在cpp文件中,添加显式实例化:

template struct Foo<int>;
template struct Foo<float>;
template struct Foo<double>;
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为obj文件上的dumpbin.exe告诉我:

017 00000000 SECT4  notype ()    External     | ?doubleIt@?$Foo@M@@SAMM@Z (public: static float __cdecl Foo<float>::doubleIt(float))
Run Code Online (Sandbox Code Playgroud)

如果我改变我的类定义来定义类头之外的函数,那么它可以正常工作:

template <typename T>
struct Foo
{
    static T doubleIt(T input);
};

template <typename T>
T Foo::doubleIt(T input)
{ …
Run Code Online (Sandbox Code Playgroud)

c++ templates inline

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

jquery动态添加隐藏字段

$().ready(function() 
  {
  $("#add").click(function() 
    {
    var vals = $("#txtaddfeature").val();
    if(vals !='')
      $('#FeatureLists').prepend('<option value="' + vals + '" selected="selected">' + vals + '</option>');
    $('#txtaddfeature').val('');
    });
  });
Run Code Online (Sandbox Code Playgroud)

如上所述将值添加到选择列表后确定

$('#FeatureLists').prepend('<option value="' + vals + '" selected="selected">' + vals + '</option>');
Run Code Online (Sandbox Code Playgroud)

我想创建一个上面定义了id = vals的动态隐藏字段,并将其值设置为在文本框中输入的值.我怎样才能做到这一点

jquery

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

有没有比使用dynamic_cast更快的方法在运行时检测对象类型?

我有一个类型的层次结构--GenericClass和一些派生类,包括InterestingDerivedClass,GenericClass是多态的.有一个界面

interface ICallback {
    virtual void DoStuff( GenericClass* ) = 0;
};
Run Code Online (Sandbox Code Playgroud)

我需要实现.然后我想检测传递给ICallback :: DoStuff()的GenericClass*指针实际上是指向InterestingDerivedClass的指针的情况:

class CallbackImpl : public ICallback {
    void DoStuff( GenericClass* param ) {
        if( dynamic_cast<InterestingDerivedClass*>( param ) != 0 ) {
            return; //nothing to do here
        }
        //do generic stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

GenericClass和派生类是我无法控制的,我只控制CallbackImpl.

我对dynamic_cast语句进行了定时 - 它需要大约1400个周期才能接受,但看起来不是很快.我试着在调试器中读取dynamic_cast期间执行的内容的反汇编,看到它需要很多指令.

因为我真的不需要指向派生类的指针,是否有更快的方法在运行时使用RTTI检测对象类型?也许某些特定于实现的方法只检查"是一个"关系但不检索指针?

c++ polymorphism dynamic visual-c++

6
推荐指数
2
解决办法
1054
查看次数

哪种屏幕键盘用于触摸屏应用?

我正在开发一个C++应用程序,它部分由Windows XP Embedded上的触摸屏驱动.用户需要一些文本输入.到目前为止,我们一直在使用标准的Windows屏幕键盘(osk.exe),但有两个主要问题:

  1. 它在较高分辨率的屏幕上相当小,这可能会使用户难以按下正确的按键
  2. 这太"丑"为客户着想,想一个滑头屏幕上的键盘,集成与自定义应用程序的外观和感觉,从而更好谁.

因此,我正在寻找Windows屏幕键盘(osk.exe)的替代品,它允许更大尺寸的按钮,并且可以进行蒙皮.理想情况下,它将具有类似BSD的许可证,可以无负担地集成到商业应用程序中,但是免版税的商业解决方案可以工作.

你知道任何这样的应用程序,或者你有一个类似的项目,你以另一种方式解决了这个问题?

c++ user-interface windows-xp touchscreen

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