在C++中是否可以对模板参数进行字符串化?我试过这个:
#define STRINGIFY(x) #x
template <typename T>
struct Stringify
{
Stringify()
{
cout<<STRINGIFY(T)<<endl;
}
};
int main()
{
Stringify<int> s;
}
Run Code Online (Sandbox Code Playgroud)
但我得到的是'T',而不是'int'.似乎预处理器在模板解析之前启动.
有没有其他方法可以做到这一点?
有没有办法在模板解析后进行预处理?(编译器是VC++).
是否可以专门化模板类的特定成员?就像是:
template <typename T,bool B>
struct X
{
void Specialized();
};
template <typename T>
void X<T,true>::Specialized()
{
...
}
template <typename T>
void X<T,false>::Specialized()
{
...
}
Run Code Online (Sandbox Code Playgroud)
当然,这段代码无效.
是否有任何理由支持在套接字上使用命名管道进行本地IPC(使用win-api),Effective-wize,resource-wize或其他方式,因为两者的行为非常相似(并且可能通过相似的接口抽象),在一个可能已经使用套接字用于网络目的的应用程序中?
我至少可以说出寻址问题:套接字的端口号与管道的文件名.此外,命名管道(AFAIK)不会警告防火墙(阻止/取消阻止对话框),尽管被阻止的应用程序仍然可以通过本地套接字进行通信.还有什么需要考虑的吗?
在使用套接字的情况下,在本地使用套接字时是否有任何winsock设置/标志?
acceptwinsock 有3个不同的版本.除了accept标准合规的基本内容之外,还有AcceptEx最先进的版本(由于它具有重叠的io功能),以及WSAAccept.后者支持条件回调,据我所知,它允许在接受之前拒绝连接请求(当SO_CONDITIONAL_ACCEPT启用该选项时).其他任何版本都不支持此功能.
由于我更喜欢使用AcceptEx重叠的io,我想知道为什么这个功能只能在更简单的版本中使用?
我不太了解TCP的内部工作原理,告诉我们在接受连接之前拒绝连接和在连接建立后立即断开连接之间实际上有什么区别?如果有,有没有办法模仿WSAAccept功能AcceptEx?
有人能否对这个问题有所了解?
我记得做过这样的事情:
template <ListOfTypenames>
class X : public ListOfTypenames {};
Run Code Online (Sandbox Code Playgroud)
也就是说,X继承自作为模板参数传递的可变长度的类型名列表.当然,这段代码是假设的.
但是我找不到任何参考.可能吗?是C++ 0x吗?
似乎从DllMain中创建一个线程,DLL_PROCESS_ATTACH直到所有dll都被加载后它才会开始.因为我需要在继续之前确保线程运行,所以我遇到了僵局.有没有办法强制线程启动?
显然,GetThreadId是一个Vista API.如何在pre vista系统上获得线程的ID?
由于类友谊不是在C++中继承的,那么"伪造"它的最佳方式是什么?
我正在考虑通过受保护的方法在要继承的基类中公开友元类的私有接口,但这导致必须两次写入(并维护)相同的接口.
还有其他方法吗?
在winsock中查看异步地址解析似乎只有两个选项要么gethostbyname在单独的线程上使用阻塞,要么使用WSAAsyncGetHostByName.后者的设计是出于某种原因使用窗口消息,而不是重叠操作和完成端口/例程.
是否有任何版本的gethostbyname异步操作以与winsock API的其余部分类似的方式与重叠操作异步工作?
我下载并安装了最新的JDK和Java ME SDK.两者似乎安装得很好.
但是,当我尝试运行SDK时,当启动屏幕上的进度条变为"启动模块..."时,它会挂起一段时间,然后开始弹出表单的异常:
java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:525)
at java.net.Socket.connect(Socket.java:475)
at java.net.Socket.<init>(Socket.java:372)
at java.net.Socket.<init>(Socket.java:186)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)
Caused: java.rmi.ConnectException: Connection refused to host: localhost; nested exception is:
java.net.ConnectException: Connection refused: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:601)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at com.sun.jndi.rmi.registry.RegistryContext.lookup(RegistryContext.java:97)
Caused: javax.naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: Connection refused to host: localhost; nested exception is:
java.net.ConnectException: Connection refused: connect]
at com.sun.jndi.rmi.registry.RegistryContext.lookup(RegistryContext.java:101) …Run Code Online (Sandbox Code Playgroud) c++ ×4
templates ×3
winapi ×3
winsock ×2
asynchronous ×1
c++-faq ×1
c++11 ×1
dll ×1
friend-class ×1
inheritance ×1
ipc ×1
java-me ×1
metadata ×1
named-pipes ×1
portability ×1
sdk ×1
sockets ×1
tcp ×1