在阅读这里的一些文档时,我遇到了这个:
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
Run Code Online (Sandbox Code Playgroud)
我不知道这是如何工作的.我读了C中的按位运算符,但我不明白你如何在一个int中包含三个(或更多!)常量,以后能够以某种方式从int中提取它们?进一步深入了解文档,我也发现了这个,这可能是相关的:
typedef enum {
kCFCalendarUnitEra = (1 << 1),
kCFCalendarUnitYear = (1 << 2),
kCFCalendarUnitMonth = (1 << 3),
kCFCalendarUnitDay = (1 << 4),
kCFCalendarUnitHour = (1 << 5),
kCFCalendarUnitMinute = (1 << 6),
kCFCalendarUnitSecond = (1 << 7),
kCFCalendarUnitWeek = (1 << 8),
kCFCalendarUnitWeekday = (1 << 9),
kCFCalendarUnitWeekdayOrdinal = (1 << 10),
} CFCalendarUnit;
Run Code Online (Sandbox Code Playgroud)
(1 << 3)
语句/变量如何工作?我很抱歉,如果这是微不足道的,但是有人可以通过解释或者发布一个好的解释链接来启发我吗?
什么是检查的具体C++中的11个功能中存在的一个好方法标准库.
对于编译器功能,我只是检查(IMHO)主要编译器的编译器版本(目前VC++,gcc,clang,也许是英特尔)虽然这不是最好和最灵活的方法,但我不知道还有更好的东西,除了有非常好的宏的铿锵声__has_feature
.
但是对于库特征来说更糟糕的是,这些特征并没有严格地与编译器耦合.目前我想使用相同的方法来检查VC++的编译器版本(假设它使用自己的库,它很容易).对于clang,我至少可以__has_include
用于大规模的基于头的查询.除此之外我想__GLIBCXX__
如果定义检查的值可能是一个好主意,但是我再次找不到任何特定libstdc ++版本引入哪些功能的信息,除了当前版本支持的功能.
这些方法应该保留给预处理器检查等,因为我想在没有任何复杂的配置过程的情况下在只有头的库中使用它而不使用任何第三方库(是的,boost是第三方).
那么在这些(非常狭窄的)条件下检查特定C++ 11库特征的可能性是什么呢?甚至可能在声明的特定功能或类型的规模上?
如果检查编译器或库版本仍然是最好的方法,我在哪里可以找到有关特定版本的libstdc ++支持的特定C++ 11特性的详细信息(也许还有其他重要的特性,libc ++)?
FWIW目前我对<cstdint>
C++ 11的<cmath>
功能感兴趣std::hash
,但这可能会改变,对于一般方法可能并不重要.
当我给sizeof(a)
,其中a=13.33
,浮子变量时,大小为4个字节.但如果我sizeof(13.33)
直接给出,大小是8字节.
我不明白发生了什么.有人可以帮忙吗?
我正在寻找一种快速多边形三角剖分算法,可以将不太复杂的2D凹面多边形(无孔)三角剖分成三角形条带,准备发送到OpenGL ES进行绘图GL_TRIANGLE_STRIP
.
我知道一些算法,但我找不到符合我需求的算法:
GL_TRIANGLE_STRIP
,你需要使用GL_TRIANGLES
它对大量顶点不是很有效.我正在开发的平台是:iOS,OpenGL ES 2.0,cocos2d 2.0.
任何人都可以帮我这样的算法吗?或者非常感谢任何其他建议.
algorithm triangulation cocos2d-iphone opengl-es-2.0 gl-triangle-strip
我有将不同的算术类型转换为半精度浮点类型的函数(只是uint16_t
最低级别的函数),并且我使用SFINAE和整数和浮点源类型具有不同的函数std::enable_if
:
template<typename T>
uint16_t to_half(typename std::enable_if<
std::is_floating_point<T>::value,T>::type value)
{
//float to half conversion
}
template<typename T>
uint16_t to_half(typename std::enable_if<
std::is_integral<T>::value,T>::type value)
{
//int to half conversion
}
Run Code Online (Sandbox Code Playgroud)
这些是通过显式实例化从通用模板化构造函数内部调用的:
template<typename T>
half::half(T rhs)
: data_(detail::conversion::to_half<T>(rhs))
{
}
Run Code Online (Sandbox Code Playgroud)
编译并运行也很好.现在我尝试通过用两个函数替换第二个函数来区分有符号和无符号整数:
template<typename T>
uint16_t to_half(typename std::enable_if<std::is_integral<T>::value &&
std::is_signed<T>::value,T>::type value)
{
//signed to half conversion
}
template<typename T>
uint16_t to_half(typename std::enable_if<std::is_integral<T>::value &&
std::is_unsigned<T>::value,T>::type value)
{
//unsigned to half conversion
}
Run Code Online (Sandbox Code Playgroud)
但是一旦我尝试编译这个VS2010给了我
错误C2995 ::
"uint16_t math::detail::conversion::to_half( std::enable_if<std::tr1::is_integral<_Ty>::value && std::tr1::is_signed<_Ty>::value, T>::type )"
已定义的函数模板. …
如何在Qt Creator for CMake项目中启用C++ 11语法高亮显示?
我在CMakeLists.txt中有这个代码:
if(CMAKE_COMPILER_IS_GNUCXX)
add_definitions(-std=c++11)
endif()
Run Code Online (Sandbox Code Playgroud)
一切都没有任何问题.
我知道如何强制Qt Creator对基于qmake的项目使用C++ 11语法高亮(在*.pro文件中将QMAKE_CXXFLAGS设置为-std = c ++ 11).CMake有没有类似的解决方案?
我正在尝试实现自己的布尔类,但不能复制&&的本机语义.以下设计的代码演示了这个问题:
#include <iostream>>
class MyBool {
public:
bool theValue;
MyBool() {}
MyBool(bool aBool) {theValue = aBool;}
MyBool operator&& (MyBool aBool) {return theValue && aBool.theValue;}
};
bool f1() {std::cout << " First\n"; return false;}
bool f2() {std::cout << " Second\n"; return false;}
int main(int argc, char** argv) {
std::cout << "Native &&\n";
f1() && f2();
std::cout << "Overloaded &&\n";
MyBool(f1()) && MyBool(f2());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译和运行时,结果是:
Native && First Overloaded && Second First
换句话说,&& on bools是懒惰的(正如任何C++程序员所期望的那样)但是重载的&&不是(正如这个C++程序员至少没想到的那样).
有没有办法让重载&&懒惰?我可以找到各种全面的延迟评估方案来提供类似Haskell的功能,但它们看起来像我的用例完全矫枉过正.
可有人请澄清差的包括选项
#include <atomic>
和#inlucde <cstdatomic>
?
我猜是没有,因为它的行为相同?
我问这个是因为在我的debian系统中我只有原子和我的kubuntu系统我得到了cstdatomic.
Debian上的编译器:版本4.7.2(Debian 4.7.2-4)
Kubuntu上的编译器:版本4.6.3(Ubuntu/Linaro 4.6.3-1ubuntu5)
我正在研究一个问题,我必须从更大的向量创建子向量.如果向量中的元素是连续的,我必须创建这些元素的向量.如果存在不连续的元素,则创建该单个元素的向量.我的逻辑如下
vector<int> vect;
for (int nCount=0; nCount < 3; nCount++)
vect.push_back(nCount);
vect.push_back(5);
vect.push_back(8);
vector<int>::iterator itEnd;
itEnd = std::adjacent_find (vect.begin(), vect.end(), NotConsecutive());
Run Code Online (Sandbox Code Playgroud)
仿函数NotConsecutive
如下
return (int first != int second-1);
Run Code Online (Sandbox Code Playgroud)
所以我期待这些std::adjacent_find
意志会让我回到迭代器,这样我就可以创建向量{0,1,2,3},向量2 {5}和向量{8}.但我不确定是否有更简单的方法?
编辑:我忘了提到我已经 std::adjacent_find
在循环中了
while(itBegin != vect.end())
{
itEnd = std::adjacent_find (vect.begin(), vect.end(), NotConsecutive());
vector<int> groupe;
if( std::distance(itBegin, itEnd) < 1)
{
groupe.assign(itBegin, itBegin+1);
}
else
{
groupe.assign(itBegin, itEnd);
}
if(boost::next(itEnd) != vect.end())
{
itBegin = ++itEnd;
}
else
{
vector<int> last_element.push_back(itEnd);
}
}
Run Code Online (Sandbox Code Playgroud)
它有意义吗?
目前我的管道中有大约15个渲染通道.对于每次传递,我在绘制之前设置正确的设置,然后重置它们.这些设置包括视口大小,打开或关闭深度测试,混合功能或关闭,模板功能,模板操作等.
我想知道OpenGL是否足够聪明,可以忽略设置已存在状态的API调用.因为否则我将跟踪具有大量标志的状态,并且在渲染过程之前仅在实际需要时设置状态.