我知道在C++ 11中我们现在可以using用来写类型别名,比如typedefs:
typedef int MyInt;
Run Code Online (Sandbox Code Playgroud)
从我的理解,相当于:
using MyInt = int;
Run Code Online (Sandbox Code Playgroud)
这种新语法来自于努力表达" template typedef":
template< class T > using MyType = AnotherType< T, MyAllocatorType >;
Run Code Online (Sandbox Code Playgroud)
但是,对于前两个非模板示例,标准中是否还有其他细微差别?例如,typedefs以"弱"方式进行别名.也就是说,它不会创建新类型,而只会创建新名称(这些名称之间隐含的转换).
它是否与using生成新类型相同或是否生成新类型?有什么不同吗?
我刚读了一些关于使用的建议
std::string s = get_string();
std::string t = another_string();
if( !s.compare(t) )
{
Run Code Online (Sandbox Code Playgroud)
代替
if( s == t )
{
Run Code Online (Sandbox Code Playgroud)
我几乎总是使用最后一个,因为我已经习惯了它,它感觉自然,更具可读性.我甚至不知道有一个单独的比较功能.更确切地说,我认为==会调用compare().
有什么区别?在哪种情况下,一种方式应该受到另一种方式的青睐?
我只考虑我需要知道字符串是否与另一个字符串相同的情况.
我在头文件中有一些代码如下:
#include <memory>
class Thing;
class MyClass
{
std::unique_ptr< Thing > my_thing;
};
Run Code Online (Sandbox Code Playgroud)
如果我有一个CPP这个头不包含的Thing类型定义,那么这并不在VS2010 SP1的编译:
1> C:\ Program Files(x86)\ Microsoft Visual Studio 10.0\VC\include\memory(2067):错误C2027:使用未定义类型'Thing'
替换std::unique_ptr为std::shared_ptr和编译.
所以,我猜这是当前VS2010 std::unique_ptr的实现,需要完整的定义,而且完全依赖于实现.
或者是吗?它的标准要求中是否有某些东西使得std::unique_ptr实施只能使用前向声明?感觉很奇怪,因为它应该只有一个指针Thing,不应该吗?
在C++ 11中,有没有办法模板化lambda函数?或者它本身太具体而无法模板化?
我理解我可以定义一个经典的模板类/仿函数,但问题更像是:语言是否允许模板化lambda函数?
之间有什么区别-std=c++11和-std=gnu++11GCC和铿锵的编译参数?同样的问题c99和gnu99?我了解C++和C标准,这是我感兴趣的参数差异.
我已经读到某处与某些扩展有关但我不清楚哪些扩展以及如何在新项目之间进行选择.
是否有YAML的架构验证语言?我用谷歌搜索,但找不到任何有用的东西.
XSD格式之类的东西,使用语言本身来描述模式,在我的情况下是最好的选择.
这是一个有效的URL吗?(从标准的角度来看)
http://test.com/some/path/version/1.2/thing
Run Code Online (Sandbox Code Playgroud) 标题说明了一切:我想设置仅限标题的C++(或C)库项目,但找不到干净的方法.
经过一些搜索后,我发现你无法设置正常的库add_library,因为它需要一个可编译的源文件.一种方法是使用add_custom_target这种方式:
# Get all headers (using search instead of explicit filenames for the example)
file( GLOB_RECURSE XSD_HEADERS
*.hxx
)
add_custom_target( libsxsd SOURCES ${XSD_HEADERS} )
Run Code Online (Sandbox Code Playgroud)
但这似乎并不完全在这里工作,因为我看不到VS2010中生成的项目中的源代码.我不知道这是一个错误,或者我做错了,或者是否有一个首选的方法,所以如果你有一个简单的解决方案,请成为我的客人.
这是一个小测试程序:
#include <iostream>
class Test
{
public:
static void DoCrash(){ std::cout<< "TEST IT!"<< std::endl; }
};
int main()
{
Test k;
k.DoCrash(); // calling a static method like a member method...
std::system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在VS2008 + SP1(vc9)上编译很好:控制台只显示"TEST IT!".
据我所知,不应该在instanced对象上调用静态成员方法.
我打算开始为一个跨平台项目"玩"基于任务的并行性.我想使用英特尔线程构建模块.我从Windows和Visual Studio开始.
因为我只是想要原型,我正在考虑只在Windows上"玩",然后有足够的知识在所有兼容平台上使用该库.
我了解到,自VS2010以来,Microsoft提供了一个类似的库,并行处理库,它具有(几乎)与英特尔TBB相同的接口.
一些消息来源建议,包括TBB的团队博客,他们一起构建它,并且它是相同的库.
然而,它并不是真正明确的,因为它经常表明两个库之间存在细微差别.
那么,如果有的话,这些差异是什么?我应该直接与去年稳定该局启动或者是低风险的原型与微软PPL只是玩,跨平台的"真实"的项目上使用该局?