小编Ale*_*ter的帖子

"typedef sometype sometype"有什么意义?

最近我在代码中遇到了以下构造:

typedef sometype sometype;
Run Code Online (Sandbox Code Playgroud)

请注意"sometype"代表完全相同的类型,没有任何添加,如"struct"等.

我想知道它有什么用处?

UPD:这仅适用于用户定义的类型.

UPD2:实际代码在模板上下文中,如下所示:

template <class T>
struct E
{
   typedef T T;
   ...
}
Run Code Online (Sandbox Code Playgroud)

c++ typedef

6
推荐指数
4
解决办法
977
查看次数

将整数集转换为范围

将一组整数转换为一组范围的最惯用的方法是什么?

例如,给定{0,1,2,3,4,7,8,9,11}我想得到{{0,4},{7,9},{11,11}}.

让我们说我们正在转变std::set<int>std::vector<std::pair<int, int>>.我认为Ranges在双方都是包容性的,因为在我的情况下它更方便,但如果有必要我也可以使用开放式范围.

我写了以下功能,但我觉得要重新发明轮子.请告诉我们STL中有什么东西或者提升它.

typedef std::pair<int, int> Range;

void setToRanges(const std::set<int>& indices, std::vector<Range>& ranges)
{
    Range r = std::make_pair(-INT_MAX, -INT_MAX);

    BOOST_FOREACH(int i, indices)
    {
           if (i != r.second + 1)
           {
            if (r.second >= 0) ranges.push_back(r);
            r.first = i;                    
           }

           r.second = i;
    }

    ranges.push_back(r);
}
Run Code Online (Sandbox Code Playgroud)

c++ algorithm range set

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

如何在迭代器方向上进行参数化?

基本上我正在做以下事情:

std::set<int> indices;
// ..fill indices

if (flag)
{
   // we need to process in ascending order
   BOOST_FOREACH (int i, indices) 
   {
      process(i);
   }
}
else
{
   // we need to process in descending order
   BOOST_REVERSE_FOREACH (int i, indices) 
   {
      process(i);
   }
} 
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法在C++ 03中编写相同的东西,只需要调用一个进程(i),以某种方式参数化处理顺序?像这样(显然在C++ 0x中不起作用,因为begin()和rbegin()返回不同的类型):

   auto iter = flag ? indices.begin() : indices.rbegin();
   auto end =  flag ? indices.end() : indices.rend();

   BOOST_FOREACH (int i, std::make_pair(iter, end)) 
   {
      process(i);
   }
Run Code Online (Sandbox Code Playgroud)

c++ foreach boost iterator stl

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

WH_MOUSE和WH_MOUSE_LL钩子之间有什么区别?

我发现WH_MOUSE并不总是这样.问题可能是我正在使用WH_MOUSE而不是WH_MOUSE_LL吗?

代码:

class MouseHook
{
public:
  static signal<void(UINT, const MOUSEHOOKSTRUCT&)> clickEvent;

  static bool install() 
  {
    if (isInstalled()) return true;
    hook = ::SetWindowsHookEx(WH_MOUSE, (HOOKPROC)&mouseProc,  
                                ::GetModuleHandle(NULL), NULL);
    return(hook != NULL);
  }

  static bool uninstall() 
  {
    if (hook == NULL) return TRUE;
    bool fOk = ::UnhookWindowsHookEx(hook);
    hook = NULL;
    return fOk != FALSE;
  }

  static bool isInstalled() { return hook != NULL; }

private:
   static LRESULT CALLBACK mouseProc(int nCode, WPARAM wParam, LPARAM lParam)
   {            
      if (nCode == …
Run Code Online (Sandbox Code Playgroud)

c++ hook winapi

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

SQLite文件锁定和DropBox

我正在开发一个使用SQLite3数据库存储数据的Visual C++应用程序.通常它大部分时间都在托盘中.

我还想将我的应用程序放在DropBox文件夹中,以便在多台PC上共享它.在DropBox最近更新之前,它确实很有效.现在它说它"无法同步正在使用的文件".SQLite文件在我的应用程序中打开,但锁是共享的.有一些准备好的陈述,但所有陈述都在使用后立即重置step.

有没有办法启用开放SQLite数据库文件的同步?谢谢!

这是我用于测试的简单包装器(没有错误处理),以防这有助于:

 class Statement
 {
 private:
  Statement(sqlite3* db, const std::wstring& sql) : db(db)
  {
   sqlite3_prepare16_v2(db, sql.c_str(), sql.length() * sizeof(wchar_t), &stmt, NULL);
  }

 public:
  ~Statement() { sqlite3_finalize(stmt); }

 public:
  void reset() { sqlite3_reset(stmt); }
  int step() { return sqlite3_step(stmt); }
  int getInt(int i) const { return sqlite3_column_int(stmt, i); }

  std::wstring getText(int i) const
  {
   const wchar_t* v = (const wchar_t*)sqlite3_column_text16(stmt, i);
   int sz = sqlite3_column_bytes16(stmt, i) / sizeof(wchar_t);
   return std::wstring(v, v + sz);
  }

 private:
  friend …
Run Code Online (Sandbox Code Playgroud)

c++ sqlite locking file dropbox

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

Oracle绑定param占位符允许哪些字符?

有谁能请指出列出允许绑定变量名称的字符的位置?我花了几个小时挖掘Oracle SQL文档无济于事.

我的意思是":id"如下:

SELECT * FROM mytable WHERE id = :id
Run Code Online (Sandbox Code Playgroud)

例如,可以在那里使用点像":some.id"吗?它的功能是否与没有点的版本完全相同?

sql database oracle parameters

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

为什么这段代码可以用 MSVC 编译,但不能用 GCC 或 Clang 编译?

以及如何修复代码?

这是代码: https: //godbolt.org/z/vcP6WKvG5

#include <memory>
#include <utility>

enum class Format {
    Number,
    Text,    
};

template <template <Format> typename Visitor, typename... Args>
void switchByFormat(Format format, Args&&... args) {
    switch(format) {
        case Format::Number: 
            Visitor<Format::Number>::visit(std::forward<Args>(args)...);
            break;
        case Format::Text: 
            Visitor<Format::Text>::visit(std::forward<Args>(args)...);
            break;
    }
}

struct AstNode {};

template <Format format>
struct ANode: public AstNode {};

using AstNodePtr = std::shared_ptr<AstNode>;

template <template <Format> typename AstNodeT, 
          typename... Args>
struct AstNodeFactory {
    template <Format format>
    struct Visitor {
        static void visit(AstNodePtr& result, Args&&... args)
        {
            result = …
Run Code Online (Sandbox Code Playgroud)

c++ templates compiler-errors language-lawyer

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

复制ctor和赋值运算符中的任何陷阱都有略微不同的语义?

请查看下面的代码并告诉我它是否会在将来导致问题,如果是,那么如何避免它们.

class Note
{
   int id;
   std::string text;

public:
   // ... some ctors here...

   Note(const Note& other) : id(other.id), text(other.text) {}

   void operator=(const Note& other) // returns void: no chaining wanted
   {
      if (&other == this) return;
      text = other.text;  
      // NB: id stays the same!    
   }
   ...
};
Run Code Online (Sandbox Code Playgroud)

简而言之,我希望复制构造函数能够创建对象的精确副本,包括其(数据库)ID字段.另一方面,当我分配时,我只想复制数据字段.但我有一些担忧,因为通常复制ctor和operator =具有相同的语义.

id字段仅由Note及其朋友使用.对于所有其他客户端,赋值运算符确实创建了精确副本.用例:当我想编辑一个笔记时,我使用copy ctor创建一个副本,编辑它,然后在管理Notes的Notebook类上调用save:

 Note n(notebook.getNote(id));
 n = editNote(n); // pass by const ref (for the case edit is canceled)
 notebook.saveNote(n);
Run Code Online (Sandbox Code Playgroud)

另一方面,当我想要创建一个与现有音符具有相同内容的全新音符时,我可以这样做:

 Note n; 
 n = notebook.getNote(id); 
 n.setText("This is a copy"); …
Run Code Online (Sandbox Code Playgroud)

c++ copy-constructor assignment-operator semantics

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

在SQLite C API中使用sqlite3_data_count()而不是sqlite3_column_count()有什么好处?

在阅读文档后,似乎函数sqlite3_column_count完全相同,但没有sqlite3_data_count所具有的限制.

为什么我要在sqlite3_column_count上使用sqlite3_data_count?谢谢!

c sqlite api

3
推荐指数
2
解决办法
3690
查看次数

在单台PC上确定编译性能硬件瓶颈的最简单方法是什么?

我现在为硬件升级节省了一些钱.我想知道的是,哪种方法可以最简单的方法来衡量哪一部分硬件是编译的瓶颈而应该进行升级?

我可以使用任何聪明的技巧吗?我已经调查了perfmon,但它有太多的计数器,如果没有确切的知识应该看什么就没有用.

条件:家庭开发,Windows XP Pro,Visual Studio 2008

谢谢!

hardware performance compilation upgrade

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

如何更新DataTable中的所有自增列?

我有一个带有“Id”列的 DataTable,它是 SQL Server 2005 数据库中的标识列。该列的 AutoIncrement 属性设置为 true。我不会用数据库中的数据填充表,因为我仅将其用于插入,因此它会从 1 开始分配虚假 ID。

但是在我调用 tableAdapter.Update() 后,我希望在该列中包含数据库分配的 REAL Ids 。

由于某种原因,只有第一行得到更新,其余的都没有更新。该表使用级联 DataRelation(分层结构)引用自身,并且对第一行的引用也会更新。

请告诉我如何使所有 Id 相应更新。

提前致谢!

插入语句:

INSERT INTO Components (ComponentId, OrderNo, SerialNo) 
VALUES (@ComponentId, @OrderNo, @SerialNo) 
Run Code Online (Sandbox Code Playgroud)

这里是组件表的架构:

Id BIGINT PK, 
ComponentId BIGINT FK, 
OrderNo int, 
SerialNo int 
Run Code Online (Sandbox Code Playgroud)

请注意,Id 列的名称是“Id”,“ComponentId”是 FK 引用列。

c# datatable ado.net auto-increment

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

迭代字符串中的行?

我想做这样的事情:

BOOST_FOREACH (const std::string& line, allLinesOf(someFileLoadedIntoString))
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何实现allLinesOf函数?谢谢!

更新:谢谢你的答案.抱歉,但我忘了提一个重要细节:在我的情况下,换行符是\ r \n.

c++ string boost

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

Python标准模块中是否存在此函数的类似内容?

我正在寻找一个标准函数(运算符,装饰器),它等同于下面的手写函数:

def defaulted(func, defaultVal):
   try:
      result = func()
   except: 
      result = defaultVal

   return result
Run Code Online (Sandbox Code Playgroud)

谢谢!

python exception standard-library

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