我之前听说POD类型不能拥有私有数据 - 但根据C++ 0x草案,我的要求是宽松的(强调我的):
对所有非静态数据成员具有相同的访问控制(第11条)
这似乎暗示私人数据是好的,只要它都是私有的.我没有C++ 03的副本但是要查看...
那么,WindowsApi::Uuid
是POD课吗?
namespace WindowsApi
{
class Uuid
{
union
{
::UUID asUuid; //Win32's UUID struct
unsigned __int64 asInt64s[2];
unsigned __int32 asInt32s[4];
};
public:
Uuid() {}
Uuid(::UUID sourceStructure) : asUuid(sourceStructure) {}
operator ::UUID() { return asUuid; }
};
}
Run Code Online (Sandbox Code Playgroud) 我正在为我的游戏开发一个导入器,它读取一个xml,然后为所有东西创建box2d主体.
例如
<polygon vertexCount="3" density="0" friction="0.25" restitution="0.30000000000000004">
<vertice x="6.506500000000001" y="0.4345"/>
<vertice x="6.534970527648927" y="0.48385302734375"/>
<vertice x="6.478029472351075" y="0.48385302734375"/>
</polygon>
Run Code Online (Sandbox Code Playgroud)
问题出在我现在面向多边形部分的导出器中,我需要在添加顶点和设置它们的位置之前设置b2vec2数组.
int count = [[childnode attributeForName:@"vertexCount"] intValue];
b2Vec2 points[count];
Run Code Online (Sandbox Code Playgroud)
但是box2d希望点[5]是一个实际的文字数字(比如点[5]而不是变量点[数字],当我有变量计数时输出的错误是:
Variable length array of non-POD element type 'b2Vec2'
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?我试着把它变成一个常数,但这也不起作用(因为我需要它是动态的,所以没有帮助我).
以下代码
#include <iostream>
#include <new>
#include <cstring>
#include <type_traits>
template<typename T>
void is_pod(char* c)
{
cout << "Type " << c;
if(std::is_pod<T>::value)
::std::cout << " is POD" << endl;
else
::std::cout << " is not!" << endl;
}
#define CHECK_TYPE(ty) ::is_pod<ty>(#ty)
struct POD_Parent{};
struct POD_Child : public POD_Parent{int y;};
struct POD_Child2 {int x; POD_Parent y; POD_Child ssd;};
int main()
{
CHECK_TYPE(POD_Parent);
CHECK_TYPE(POD_Child);
CHECK_TYPE(POD_Child2);
Run Code Online (Sandbox Code Playgroud)
给出以下结果:哪个很奇怪!
Type POD_Parent is POD
Type POD_Child is not!
Type POD_Child2 is POD
Run Code Online (Sandbox Code Playgroud)
POD_Child怎么不是POD?!和POD_Child2是POD?!!
请注意,我使用MinGW编译它(使用选项-std = c …
根据C++标准:
标准布局类是一个类:
- 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员.
引用的哪些属性会阻止具有引用成员的类包含在标准布局类的定义中?
我尝试用其他类型谓词来理解POD概念.
是否有完整的类型谓词列表std::is_pod<>
?
这是我目前的尝试不成立(VS2013).
struct C { // Does not assert as POD class
int value;
C() = default;
C(int v) : value(v) { // Offends is_pod<>
}
};
static_assert(std::is_trivial<C>::value, ""); // Assert OK
static_assert(std::is_trivially_copyable<C>::value, ""); // Assert OK
static_assert(std::is_standard_layout<C>::value, ""); // Assert OK
static_assert(std::is_pod<C>::value, ""); // Assert fails. Why?
Run Code Online (Sandbox Code Playgroud) 我创建了示例项目来演示问题 https://github.com/pikciu/XCodeWorksapce/tree/noPods
有4种构建配置和2种方案.每个构建配置使用不同的xcconfig文件.
Lib.framework链接到主项目.
即使主项目在Debug中构建,XCode也会在Release配置中构建框架.
我找到了这些解决方案: Xcode在具有多个项目的工作区中构建配置以及如何在具有不同配置名称的同一工作区中使用app和库编译项目?
MODULES_BUILDS = $(DEFAULT_CONFIGURATION)-$(PLATFORM_NAME)
FRAMEWORK_SEARCH_PATHS = $(BUILD_DIR)/$(MODULES_BUILDS)
HEADER_SEARCH_PATHS = $(FRAMEWORK_SEARCH_PATHS)/include
LIBRARY_SEARCH_PATHS = $(FRAMEWORK_SEARCH_PATHS)
Run Code Online (Sandbox Code Playgroud)
但它不起作用.也许是XCode 10问题?
是否可以将pod代码转换为保存在变量中的方式,使其$=pod
与pod2text一起使用时的行为类似于?
#!/usr/bin/env perl6
use v6;
use Pod::To::Text;
my $code = $*PROGRAM.slurp;
my $pod = $code.subst( / ^ .+ \n <?before '=begin pod'> /, '' );
# convert $pod so it works with pod2text like $=pod does
say pod2text $pod;
say "==============";
say pod2text $=pod;
=begin pod
=head1 NAME
Test pod
=head1 DESCRIPTION
This is a test.
=end pod
Run Code Online (Sandbox Code Playgroud) 我赞成一种文字编程风格,在他们记录的代码旁边有POD注释.不幸的是,这膨胀了代码,这不是非常Perlish ;-)我现在能找到的最好的方法是使用Dist :: Zilla和Pod :: Weaver一样:
package Foo;
#ABSTRACT: Foobar helper module for Foos
=method foo ( $bar, $doz )
Lorem ipsum hopladi and hoplada.
=cut
sub foo {
...
}
Run Code Online (Sandbox Code Playgroud)
人们可能会争论删除空行,但这也会降低可读性.有没有办法写更简洁,没有任何重复和不必要的语法,如下所示:
package Foo;
#ABSTRACT: Foobar helper module for Foos
#METHOD: Lorem ipsum hopladi and hoplada.
sub foo { # $bar, $doz
...
}
Run Code Online (Sandbox Code Playgroud)
并将此扩展到完整的POD:
=head1 NAME
Foo - Foobar helper module for Foos
=head1 METHODS
=head2 foo ( $bar, $doz )
Lorem ipsum hopladi and …
Run Code Online (Sandbox Code Playgroud) 我有一些代码,它采用打包的POD结构/类并将其复制到内存块中.
struct A
{
int a;
int b;
} a;
memcpy(mymemoryblock, (void *)&a, sizeof(A));
// later I get a reply and...
memcpy((void *)&a, mymemoryblock, sizeof(A));
Run Code Online (Sandbox Code Playgroud)
这仅适用于POD类型的数据,如果有一种方法可以测试POD-ness,我想知道什么.如果有人不小心将成员函数添加到此类,则memcpy操作将变为无效,但仍可编译.这导致很难检测到错误.
是否有一个is_POD_type(A)函数,或者可以用来在运行时或编译时检测PODness的其他技巧?
根据C++ 11 中POD的宽松定义,我的理解是以下结构被认为是POD:
template <class T>
struct Foo
{
Foo()
{ }
explicit Foo(T* obj) : m_data(obj)
{ }
T* m_data;
};
Run Code Online (Sandbox Code Playgroud)
但是,使用GCC 4.6并使用-std=c++0x
标志进行编译,如果我说:
std::cout << std::boolalpha << std::is_pod<Foo<int>>::value << std::endl;
Run Code Online (Sandbox Code Playgroud)
它输出:
false
Run Code Online (Sandbox Code Playgroud)
这是一个显示完整程序的ideone链接.(注意,ideone使用GCC 4.5)
那么,我对C++ 11中的POD的理解是错误的,还是GCC 4.6在C++ 11合规方面根本不是最新的?