如果我有一个模板:
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.
我希望这是有道理的.
我试图写一个类,我自己投运营商,但我有多个问题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 ++应用程序中使用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(我不能在他们的发布位置看到).
在我的应用程序中,我经常调用一个返回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(...)之前"检查"该字符串会导致内存耗尽.
那可能吗?
我有一个计时器,每 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,永远不会增加。
有几点
我有一个函数可以将~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)
如何在跟踪单词出现在向量中的次数的同时加快"分组"的速度?