在我的序列化系统中,我可以提供实现如何序列化给定类型的非成员函数:

// struct foo
struct foo {
    int bar;
};

// serialize foo
template <class stream> void serialize(stream& s, foo& f) {
    stream.serialize(f.bar);
}


如果对于给定类型不存在非成员函数serialize时,我想提供一个空的serialize实现,如何使用C ++ 11实现呢?

我试过了

template <class stream, class type> void serialize(stream&, type&) {}

// struct foo
struct foo {
    int bar;
};

// serialize foo
template <class stream> void serialize(stream& s, foo& f) {
    stream.serialize(f.bar);
}

// ...later in source file:
foo f;
stream s;
serialize(s, f);


但是它总是以某种方式调用空方法。

最佳答案

添加非成员函数模板。

template <typename stream, typename T> void serialize(stream& s, T& t) {}


这是一个演示程序:

#include <iostream>

template <typename stream, typename type> void serialize(stream&, type&)
{
   std::cout << "Came to 1\n";
}

struct stream
{
   void serialize(int ) {}
};

// struct foo
struct foo {
    int bar;
};

// serialize foo
template <class stream> void serialize(stream& s, foo& f) {
   std::cout << "Came to 2\n";
   s.serialize(f.bar);
}

struct bar {
};

int main()
{
   // ...later in source file:
   foo f;
   stream s;
   serialize(s, f);
   bar b;
   serialize(s, b);
}


并在cygwin / g ++ 6.4.0下输出:

Came to 2
Came to 1


它也可以在ideone.com下使用。

关于c++ - C++ 11在缺少时提供空的非成员函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51328177/

10-11 00:15