【发布时间】:2021-11-16 15:30:55
【问题描述】:
我正在寻找解决方案来禁用模板参数结构,这些结构是 POD(或说可复制)但具有指针。我将通过网络发送它们。例如
// good
struct S1 {
int x;
S1() : x( 42 ) {} // I know that it's not a POD, but I know, that I can send S1 over network
};
// bad
struct S2 {
int *x;
};
template<typename POD>
class ToNetwork {
//static_assert( std::is_trivially_copyable< POD >::value, "Type must be POD" );
static_assert( std::is_standard_layout< POD >::value, "Type must be POD" );
POD m_payload;
};
ToNetwork< S1 > s1;
ToNetwork< S2 > s2; // should fail, but not((
is_trivially_copyable 或 is_standard_layout 都说这两种结构都很好。
【问题讨论】:
-
不确定这是否可以自动检测。假设您有一个
struct S3 { some_iterator_type it; }。或struct S4 { size_t index_into_some_container; }; -
请注意,您通常必须单独处理每个成员(至少要处理字节序),因此无论如何您都不能简单地
memcpy结构。 -
@Jarod42 我有一个
template<typename POD>并想memcpy它。我不知道POD的成员 -
@463035818_is_not_a_number 我看到了 MSVC 对
iterator的实现——它有指针。这就是为什么如果我能找到解决方案,那么迭代器就不会成为问题。如果我发送静态数组([42])并在其中索引对我有好处