可能重复:
使用forward的优点
我知道它的作用以及何时使用它但我仍然无法理解其工作原理.请尽可能详细,并解释std::forward
如果允许使用模板参数推断,何时不正确.
我的一部分困惑是:"如果它有一个名字,它就是一个左值" - 如果是这样的话,为什么std::forward
当我通过thing&& x
vs 时表现不同thing& x
?
在VS2010中,有一个选项可以在链接器下为exes/dll生成调试信息,但在库的librarian下没有这样的选项.调试信息是否嵌入在静态库中?
libs,exes和dll的程序库文件名的C/C++属性中有一个选项.默认情况下,它进入我的中间目录,并命名为libs的项目名称,但名为vc $(PlatformToolsetVersion).pdb for exes/dlls.这个选项的pdb是什么,它与链接器选项中的pdb有什么不同?
如果我提供带有库和头文件的库,如何向库的用户提供调试符号?
vcxproj.filters不应嵌入.vcxproj中吗?目前我必须检查源代码控制,以便其他人可以在解决方案中看到文件夹结构.
鉴于以下内容:
template<typename T>
class A
{
public:
static const unsigned int ID = ?;
};
Run Code Online (Sandbox Code Playgroud)
我希望ID为每个T生成一个唯一的编译时间ID.我考虑过__COUNTER__
并且增强PP库但到目前为止都没有成功.我怎样才能做到这一点?
编辑:ID必须可用作switch语句中的大小写
Edit2:基于静态方法或成员地址的所有答案都不正确.尽管它们确实创建了唯一的ID,但它们在编译时未得到解析,因此不能用作switch语句的情况.
让我通过这个测试程序问我的问题:
#include <iostream>
#include <chrono>
using std::chrono::nanoseconds;
using std::chrono::duration_cast;
int main(int argc, char* argv[])
{
std::cout << "resolution (nano) = " << (double) std::chrono::high_resolution_clock::period::num
/ std::chrono::high_resolution_clock::period::den * 1000 * 1000 * 1000 << std::endl;
auto t1 = std::chrono::high_resolution_clock::now();
std::cout << "how much nanoseconds std::cout takes?" << std::endl;
auto t2 = std::chrono::high_resolution_clock::now();
auto diff = t2-t1;
nanoseconds ns = duration_cast<nanoseconds>(diff);
std::cout << "std::cout takes " << ns.count() << " nanoseconds" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我机器上的输出:
分辨率(纳米)= 100
std :: cout需要多少纳秒? …
我从1970年1月1日00:00开始的秒数为纳秒的int64,我试图将其转换为月/日/年/星期.
迭代地执行此操作很容易,我有这个工作,但我想公式化.我正在寻找实际的数学.
在VS2010中,std :: forward定义如下:
template<class _Ty> inline
_Ty&& forward(typename identity<_Ty>::type& _Arg)
{ // forward _Arg, given explicitly specified type parameter
return ((_Ty&&)_Arg);
}
Run Code Online (Sandbox Code Playgroud)
identity
似乎仅用于禁用模板参数推断.在这种情况下故意禁用它有什么意义?
鉴于:
struct A
{
virtual bool what() = 0;
};
template<typename T, typename Q>
struct B : public A
{
virtual bool what();
};
Run Code Online (Sandbox Code Playgroud)
我想部分专注what
如下:
template<typename T, typename Q>
bool B<T, Q>::what()
{
return true;
}
template<typename Q>
bool B<float, Q>::what()
{
return false;
}
Run Code Online (Sandbox Code Playgroud)
但似乎这是不可能的(它是否在C++ 11中?)所以我尝试了SFINAE:
template<typename T>
typename std::enable_if<std::is_same<T, float>::value, bool>::type B<T>::what()
{
return true;
}
template<typename T>
typename std::enable_if<!std::is_same<T, float>::value, bool>::type B<T>::what()
{
return false;
}
Run Code Online (Sandbox Code Playgroud)
这也行不通,我不知道为什么,有人吗?所以我找到了这个帖子,结果是:
template<typename T, typename Q>
struct B …
Run Code Online (Sandbox Code Playgroud) 我今天读到一些有趣的内容,说用户提供的类型(作为模板参数提供)调用swap的"标准"方式是......
using std::swap;
swap(something, soemthingelse);
Run Code Online (Sandbox Code Playgroud)
这样做的原因是使用的参数依赖查找要么使用一个swap
在用户的命名空间或函数swap
的std
命名空间.这为我提出了一个感兴趣的问题.当我超载std::swap
了我的课之一,我实际上已被定义它的std
命名空间... namespace std { void swap(/*...*/){/*...*/} }
.这种做法错了吗?我应该定义自己的swap
s std
或我自己的命名空间(以及为什么)?
今天下午在英国布里斯托尔,ISO C++标准委员会采用了通用lambdas,动态数组(C99 VLAs的改进版本),变量模板,读取器/写入器锁,make_unique,可选,标准库用户定义的文字,以及一些其他语言和图书馆改进 - 并批准结果作为标准C++ 14的特征完整委员会草案(CD),将分发给其主要的国际审查投票.
我很感兴趣阅读有关新功能的细节,但我似乎找不到比上面的链接更多的关于它们的文章.