小编Sim*_*man的帖子

存储和重新使用decltype值?

如果我有一个模板:

template <class T>
struct Item
{
  T _value;
};
Run Code Online (Sandbox Code Playgroud)

然后我可以这样做:

// ...
Item<int> x = { 42 }; // declared as an int

// ...
decltype(x._value) y = 20; // 'y' is also an int
Run Code Online (Sandbox Code Playgroud)

但是可以将decltype变量存储到变量中以便以后使用吗?

为什么?
我想将项的值存储为指针.

有点像std::vector<Item*>但是因为它们是模板我必须将它们存储为指针void:

std::vector<void*> is;
is.push_back(new Item<int>());
is.push_back(new Item<double>());
is.push_back(new Item<float>());
Run Code Online (Sandbox Code Playgroud)

这一切都很好,但是当需要删除指针时,我需要将我的void*表格重新转换为正确的类型(因此调用析构函数):

delete (Item<int>*)is[0];
Run Code Online (Sandbox Code Playgroud)

如果我知道类型,我可以这样做:

delete (Item<decltype(whatever)>*)is[0];
Run Code Online (Sandbox Code Playgroud)

因此我需要存储的原因decltype.

我希望这是有道理的.

c++ templates decltype c++11

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

对于std :: string,'operator ='是不明确的

我试图写一个类,我自己投运营商,但我有多个问题operator=小号

我设法用下面的小代码重现了这个问题

#include <string>

class X
{
public:
  operator const char*() const {
    return "a";
  }
  operator std::string() {
    return "c";
  }
};

void func( )
{
  X x;
  std::string s = "";
  s = x;
}
Run Code Online (Sandbox Code Playgroud)

我知道std::basic_string有多个赋值运算符,这就是编译器混淆的原因.

如果我删除任何一个强制转换运算符,它可以工作,但我想知道是否有一种方法可以保留两个运算符.

我的班级将根据演员表返回不同的值.

我也可以使用static_cast<std::string>(x)强制演员,但我想知道是否有一种方法可以在没有静态演员的情况下进行演绎?

c++ c++11

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

在c ++项目中使用pcre2

我正在寻找在我的简单c ++应用程序中使用pcre2,(我正在使用vs2015).(我正在看各种正则表达式库,一般的感觉是pcre/pcre2是最灵活的)

首先我从官方位置下载了pcre2,(http://sourceforge.net/projects/pcre/files/pcre2/10.20/)并创建了一个非常简单的例子.

#define PCRE2_CODE_UNIT_WIDTH 8
#include <pcre2.h>
...
PCRE2_SPTR subject = (PCRE2_SPTR)std::string("this is it").c_str();
PCRE2_SPTR pattern = (PCRE2_SPTR)std::string("([a-z]+)|\\s").c_str();

...
int errorcode;
PCRE2_SIZE erroroffset;
pcre2_code *re = pcre2_compile(pattern, PCRE2_ZERO_TERMINATED, 
                                PCRE2_ANCHORED | PCRE2_UTF, &errorcode,  
                                &erroroffset, NULL);
...
Run Code Online (Sandbox Code Playgroud)

首先文件" pcre2.h "不存在,所以我将pcre2.h.generic命名pcre2.h

但后来我得到了未解析的外部链接器错误.

我猜我需要从源到项目包含一个或多个文件.但我不愿意随意添加文件而不知道它们的作用.

有人可以给出一些简单的步骤来使用pcre2成功构建项目吗?

更新
这不是一个导入库问题,pcre2.h没有librar(我不能在他们的发布位置看到).

c++ pcre visual-c++ c++11

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

'safe'json_decode(,,,)以防止耗尽内存

在我的应用程序中,我经常调用一个返回json字符串的外部api.

$url = 'api.example.com/xyz';
$blah = json_decode( file_get_contents( $url ) );
Run Code Online (Sandbox Code Playgroud)

但在某些情况下,我得到了

PHP致命错误:允许的内存大小xxx字节耗尽(试图分配32个字节)...

我无法控制外部API,当然我可以增加php的内存,但这有一些缺点.

1-无论我设定的尺寸如何,仍然可能太少.2-如果我将内存大小设置为"无限",那么我可能会冒着杀死我的服务器的风险.

理想情况下,我想在调用json_decode(...)之前"检查"该字符串会导致内存耗尽.

那可能吗?

php json

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

CancellationToken 泄漏内存

我有一个计时器,每 2 秒启动 2 个任务...我在一个简单的列表中跟踪这些任务(这样我可以在停止应用程序时等待它们完成)。

这些任务有效地进入数据库,运行一些更新并完成。
任务本身的运行时间不会超过一秒

...
// global variables to keep track of the running tasks.
List<Task> _tasks = new List<Task>();
CancellationTokenSource _cts = new CancellationTokenSource();

// in the timer function
private void Timer(object sender, ElapsedEventArgs e)
{
  _tasks.Add( Foo1Async(_cts.Token) );
  _tasks.Add( Foo2Async(_cts.Token) );
  // remove the completed ones
  _tasks.RemoveAll(t => t.IsCompleted);
}
...
Run Code Online (Sandbox Code Playgroud)

几分钟后,内存从 40Mb 增加到 130Mb,(并且还在攀升)...

如果我只替换下面的代码而不替换其他任何内容

...
  _tasks.Add( Foo1Async( CancellationToken.None)) );
  _tasks.Add( Foo2Async( CancellationToken.None)) );
...
Run Code Online (Sandbox Code Playgroud)

内存保持稳定在 40Mb,永远不会增加。

有几点

  • 我在测试期间不会取消任何任务(它们都会运行完成)。
  • 我在测试期间没有抛出任何异常。
  • 我使用的数据库是Sqlite
  • 在这两个测试中,我做了完全相同的工作,唯一的区别是使用的 …

c# asynchronous cancellationtokensource

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

快速'分组/计数'std :: vector <std :: u16string>到std :: map <u16string,int>

我有一个函数可以将~10000个单词读入一个向量,然后我想将所有单词分组到一个地图中以"计算"某个单词出现的次数.

虽然代码"有效"但有时需要2秒才能重新构建地图.

NB:不幸的是,我不能改变'读'功能,我必须使用矢量std::u16string.

std::vector<std::u16string> vValues;
vValues.push_back( ... )
...

std::map<std::u16string, int> mValues;
for( auto it = vValues.begin(); it != vValues.end(); ++it )
{
  if( mValues.find( *it ) == mValues.end() )
  {
    mValues[*it] = 1;
  }
  else
  {
    ++mValues[*it];
  }
}
Run Code Online (Sandbox Code Playgroud)

如何在跟踪单词出现在向量中的次数的同时加快"分组"的速度?

c++ vector c++11

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