- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的代码片段是:
namespace serialization
{
struct output_stream
{
/////
void write(const void* data, size_t size)
{
const byte_t* p = static_cast<const byte_t*>(data);
size_t old_size = buffer_.size();
buffer_.resize(old_size + size);
memcpy(buffer_.data() + old_size, p, size);
}
}
struct input_stream
{
///////
void read(void* to, size_t size)
{
assert(cur_ + size <= end_);
memcpy(to, cur_, size);
cur_ += size;
}
}
}
template <class stream_t>
void serialize(not_pod_struct& r, stream_t stream)
{
if (std::is_same<stream_t, serialization::output_stream>::value)
{
stream.write(&r, sizeof(r));
}
else if (std::is_same<stream_t, serialization::input_stream>::value)
{
not_pod_struct* buf = new not_pod_struct[sizeof(not_pod_struct)];
stream.read(buf, sizeof(not_pod_struct));
r = *buf;
}
else
{
throw std::invalid_argument("stream_t is not a stream.");
}
}
template<class T>
typename enable_if<!is_pod<T>::value, void>::type
read(input_stream & input_stream, T & non_pod_struct)
{
serialize(non_pod_struct, input_stream);
}
template<class T>
typename enable_if<!is_pod<T>::value, void>::type
write(output_stream & output_stream, T & non_pod_struct)
{
serialize(non_pod_struct, output_stream);
}
我有错误:
Error 1 error C2039: 'read' : is not a member of 'serialization::output_stream'
Error 2 error C2039: 'write' : is not a member of 'serialization::input_stream'
这很奇怪。我不明白为什么会发生这些错误。
最佳答案
if
在某些其他语言中不是 static if
。未到达的分支仍然必须编译。
标签分派(dispatch)(如果你正在做比 is_same
更复杂的事情(例如,接受基于 is_input_stream
特征的各种流),这更有用);没有太多意义在使用只接受两种类型并且对每种类型做完全不同的事情的模板时):
template <class stream_t>
void serialize(not_pod_struct& r, stream_t & stream,
std::true_type /* is_input */, std::false_type /* is_output */)
{
not_pod_struct* buf = new not_pod_struct[sizeof(not_pod_struct)];
stream.read(buf, sizeof(not_pod_struct));
r = *buf;
}
template <class stream_t>
void serialize(not_pod_struct& r, stream_t & stream,
std::false_type /* is_input */, std::true_type /* is_output */)
{
stream.write(&r, sizeof(r));
}
template <class stream_t>
void serialize(not_pod_struct& r, stream_t & stream)
{
serialize(r, stream, std::is_same<stream_t, serialization::input_stream>(),
std::is_same<stream_t, serialization::output_stream>());
}
或者只是为 output_stream
和 input_stream
重载 serialize
:
void serialize(not_pod_struct& r, serialization::input_stream & stream)
{
not_pod_struct* buf = new not_pod_struct[sizeof(not_pod_struct)];
stream.read(buf, sizeof(not_pod_struct));
r = *buf;
}
void serialize(not_pod_struct& r, serialization::output_stream & stream)
{
stream.write(&r, sizeof(r));
}
我冒昧地让 serialize
通过引用接受流。另外,我认为您的“阅读”逻辑不正确。你不仅泄漏了用 new
分配的内存,我非常怀疑你打算分配一个 sizeof(not_pod_struct)
的数组 not_pod_struct
关于c++ - 为什么 std::is_same 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29638132/
为什么这段代码会产生错误的输出? //this-type.cpp #include #include using namespace std; template class A { public
考虑以下代码: struct A { using type = int; using reference = int&; }; static_assert(std::is_same_v
is_same 对代码性能有影响吗?我在我的代码中多次使用它来检查我是否必须使用 std::less 或 std::greater 并且根据它们我必须检索特定值。我的测试是否足以证明 std::is_
if (std::is_same::value) { float a; somefunc_float(x,len,&a); } 上面的代码来自一个模板,
*编辑:不知何故我认为编译器正在创建 B正如A ,导致我假设 is_same 应该如何评估它们,而不管继承/派生。我的错 :( 对不起,随后的误解:\* 制作一些元函数来检查我的自定义类型,并遇到了这
我的 enable_if 语句变得很长,所以我想以某种方式进行 typedef。我不确定最好的方法是什么。 我试过了,还是不行 template struct isValidImageFormat {
我对以下问题感到困惑。我想写一些特征结构来测试某个类是否派生自另一个类。这可以通过 boost::is_base_of<> 来解决。但是,我要测试的基类有一个未定义的模板参数。 下面是一些代码示例:
我在将 std::is_same 效用函数与右值和左值引用结合使用时遇到了一个奇怪的行为。 考虑这个检查变量 t 类型的函数模板。 我正在使用 VS 2013: struct Test {}; tem
在一个项目中,我发现了一种保持 DRY 的可能性,因为除了一些小部分之外,对于模板的模板特化,很多代码可以保持不变。这是我目前正在做的一个小工作示例,用于检查我使用的是哪个模板类: template
我有一个函数模板,我想限制可以实例化它的类型集。 我是这样写的: template void DoSomething( /* ... Some parameters involving T ...
我知道constexpr函数不必在编译时求值,但如果可能的话。是下面的条件if是否在编译时评估? template inline std::string toString(const T& arg,
我正在使用第三方 API,其中包含一个包含一组 typedef 的头文件。在过去的 4 年里,一些 typedef 发生了微小的变化(例如,在 unsigned/signed 之间切换,从 int 变
这个问题在这里已经有了答案: Using commas inside a macro without parenthesis: How can I mix and match with a temp
相关问题:template-function-is-same-in-template-classes 我对指针“this”的类型感到有点不安(gcc 4.7.2,c++11)。原则上,例如C类型的非常
我的代码片段是: namespace serialization { struct output_stream { ///// void write(c
这个问题在这里已经有了答案: using std::is_same, why my function still can't work for 2 types (4 个答案) 关闭 2 年前。 考虑
在下面的代码中,为什么调用fun的两种方式呢? : fun(num)和 fun(num) , 编译时给出不同的结果? #include using namespace std; template::
是否可以像下面那样在没有模板特化的情况下进行编译? template class A { public: #if std::is_same void has_int() {} #elif
这个问题在这里已经有了答案: Accessing a class member in an if statement using std::is_same (2 个答案) using std::is
以下代码是 gcc 错误吗?检查 T 类型是否为尚未定义的 Circle 类,返回 false。 #include using namespace std; // uncomment to work
我是一名优秀的程序员,十分优秀!