小编App*_*ood的帖子

部分类模板专业化是这个设计问题的答案吗?

假设您有一个班级,他们的工作就是连接到远程服务器.我想抽象这个类来提供两个版本,一个通过UDP连接,另一个通过TCP连接.我想构建最精简的运行时代码,而不是使用多态,我正在考虑模板.这是我想象的,但我不确定这是最好的方法:

class udp {};
class tcp {};

template<class T,typename X>
class service
{
private:
  // Make this private so this non specialized version can't be used
   service();
};

template<typename X>
class service<udp, X>
{
private:
   udp _udp;
   X _x;
};

template<typename X>
class service<tcp, X>
{
private:
   tcp _tcp;
   X _x;
};
Run Code Online (Sandbox Code Playgroud)

因此最终的好处是T的通用性仍然可用,但设置UDP或TCP连接所需的非常不同的代码已经过专门化.我想你可以将它们放在一个类中,或者提供另一个类,它遵循一些纯虚拟接口来设置网络连接,比如IConnectionManager.

但这确实留下了通用T的代码问题,现在必须在两个专用版本中编写和维护,它们最终都是相同的.如何最好地解决这个问题?我有一种感觉,我认为这一切都错了.

c++ oop templates specialization

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

什么时候可以从C++中的析构函数中抛出异常?

我知道规则是不要在析构函数中抛出一个,我理解为什么.我不敢这样做.但即使是C++ Faq Lite也说99%的这个规则很好.他们未能深入研究的另外1%是什么?

从〜()链接到C++ Faq Lite子弹点:

c++ exception

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

有没有办法从Python模块构建类似C的DLL?

我有一个Python模块,只有常规的全局函数.我需要从另一个只能调用C DLL的业务域脚本环境中调用它.反正有没有建立我的Python模块,以便其他代码可以像从DLL导出的标准C函数一样调用它?这适用于Windows环境.我知道IronPython,但据我所知它只能构建.NET程序集,它不能作为C DLL函数调用.

python

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

asio计时器什么时候超出范围?

我的意思是,假设您在asio计时器上执行async_wait并将更新绑定到引用类型T的函数.假设您在将其传递给async_wait之前最初在堆栈上创建了T. 在async_wait结束时,它调用async_wait本身,反复更新计时器.该堆栈分配的类型T是否保持活动状态,直到定时器第一次不自行更新,或者在第一次调用该函数后T将超出范围?

c++ boost boost-asio

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

将存储过程的返回值分配给SQL中的变量的最佳方法是什么?

我有一个存储过程,它返回一个valueI,从需要检索此值的其他存储过程中调用它.调用存储过程在事务内部,返回值的存储过程(实际创建值并将其存储在没有其他proc触及的表中)不在其自己的事务中,但是将成为调用者事务的一部分.

问题是,检索存储过程的返回值并将其存储在调用proc中的变量中的最有效方法是什么?

目前我有以下内容,我想知道它是否效率很低?

DECLARE @tmpNewValue TABLE (newvalue int)
INSERT INTO @tmpNewValue EXEC GetMyValue

DECLARE @localVariable int
SET @localVariable = (SELECT TOP 1 newvalue FROM @tmpNewValue )
Run Code Online (Sandbox Code Playgroud)

这样做有没有更直接的方式?这不是一个昂贵的(在性能方面)方式吗?

我的存储过程没有输出参数,它只返回一个值.使用输出参数会更快吗?

为了我的价值,我正在使用MS SQL Server 2005

sql t-sql sql-server sql-server-2005

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

Boost犯了不像Boost一样的罪行吗?

我刚刚阅读了Boost :: Spirit LL Parser框架的介绍.前言表明作者和创作者喜欢使用这种解析技术来阅读程序选项.Boost没有自己的程序选项库吗?

我想知道,Boost委员会是否会审查所有图书馆笔记的共同主题和风格?看起来每个图书馆的文档都有自己的风格.

对于其他令人惊奇的软件的小抱怨,我发现它很好奇.

c++ parsing boost boost-spirit

5
推荐指数
3
解决办法
1468
查看次数

调用file.close()后,为什么Python不释放文件句柄?

我在使用Python 2.5的Windows上.我有一个用于写作的开放文件.我写了一些数据.调用文件关闭.当我尝试使用Windows资源管理器从文件夹中删除文件时,它会出错,并说进程仍然保存文件的句柄.

如果我关闭python,然后再试一次,它就会成功.

python

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

如何针对发布版本的lib(MSVCRT.lib)构建调试.exe(MSVCRTD.lib)?

我正在使用Visual C++ 2008,SP1.我在调试构建配置中有一个QT应用程序(gui,.exe).它设置为使用CRT的多线程调试DLL版本,即MSVCRTD.lib.

我正在链接第三方库,该库是在发布模式下构建的,并使用CRT的多线程DLL(非调试)版本,即MSVCRT.lib.

它链接并运行但在启动时崩溃.在链接时我收到警告:

链接:警告LNK4098:defaultlib'MSVCRT'与使用其他库冲突; 使用/ NODEFAULTLIB:库

我尝试设置/NODEFAULTLIB:msvcrt.lib

但由于缺少符号,导致5个链接错误.

所以不可能使用两个不同的库吗?有什么选择?我可以从我拥有的第三方库中创建一个DLL吗?或者这是第三方必须做的事情?

启动时的例外是:

"在MyApp.exe中......处理未处理的异常:......访问冲突读取位置0x00000000f"

以下是应用程序运行后的调用堆栈,它崩溃了:

MyApp.exe!std::_Aux_cont::_Getcont()  + 0xa bytes   C++
MyApp.exe!std::_Iterator_base_aux::_Getmycont()  + 0x1b bytes   C++
MyApp.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,unsigned int,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,unsigned int> >,0> >::const_iterator::operator*()  + 0x28 bytes  C++
MyApp.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,unsigned int,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,unsigned int> >,0> >::iterator::operator*()  + 0xf bytes C++
MyApp.exe!std::map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,unsigned int,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,unsigned int> > >::operator[]()  + 0xe9 bytes    C++
MyApp.exe!ThirdPartyLib::client::`anonymous namespace'::init_xlt_mode()  + 0x5f bytes   C++
MyApp.exe!_GetCommandLineW@0()  + 0x8d8f3 bytes C++ …
Run Code Online (Sandbox Code Playgroud)

c++ linker visual-studio visual-c++

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

需要解释此boost :: asio计时器示例

Boost asio的第3个教程中有一行显示了如何更新计时器并防止其漂移.该行如下:

 t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
Run Code Online (Sandbox Code Playgroud)

也许是我,但我无法找到关于e的第二次使用的文档xpires_at(),没有参数.expires_at(x)设置新的到期时间,取消任何待处理的完成处理程序.所以推测expires_at()会做什么,最后一次到期的返回时间?因此,通过增加一秒,如果应该有一些ms,比如说n ms,那么它本质上将从下一个到期时"减去",因为时间被计算在内?如果在此示例中执行此处理程序所需的时间大于1秒,会发生什么?它会立即开火吗?

c++ boost boost-asio

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

在现代C++应用程序中使用Win32代码时,是否应该使用正确的转换?

例如,可以在整个MSDN文档中找到以下演员:

(LPTSTR)&lpMsgBuf
Run Code Online (Sandbox Code Playgroud)

我应该把它转换成:

static_cast<LPTSTR>(&lpMsgBuf);
Run Code Online (Sandbox Code Playgroud)

或者我应该留下所有惯用的C-esque Win32部分,因为它们通常在文档中找到,并为我的其余代码保存更惯用的C++样式/用法?

c++ winapi visual-c++

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