SFINAE无法序列化共享指针

时间:2019-06-03 15:03:40

标签: c++ serialization boost sfinae

我正在尝试使boost序列化模板专门用于在c ++ 14模式下使用boost 1.58,gcc 5.4的具有特定基类的对象的共享指针。我相信我拥有正确的SFINAE设置来专用于该功能,但是编译器不会选择我期望的功能。

#include <memory>
#include <fstream>
#include <boost/archive/binary_oarchive.hpp>

class Artifact {
public:
  Artifact() {}
  virtual ~Artifact() {} // make polymorphic
};

class TestArtifact: public Artifact {
public:
  TestArtifact() : Artifact() {}
};


namespace boost {
namespace serialization {
template <class Archive, class T>
void serialize(Archive &ar,
               std::shared_ptr<typename std::enable_if<std::is_base_of<Artifact,T>::value,T>::type>& artifact,
               //std::shared_ptr<T>& artifact,
               unsigned int version) {
  // save common Artifact structure on save ...

  // Use factory to create specific Artifact (like TestArtifact) shared pointer
  // from common Artifact info on load
}

}
}

int main(int argc, char** argv) {
  auto t = std::make_shared<TestArtifact>();

  std::cout << typeid(std::shared_ptr<TestArtifact>).name() << std::endl;
  std::cout << typeid(std::shared_ptr<typename std::enable_if<std::is_base_of<Artifact,TestArtifact>::value,TestArtifact>::type>).name() << std::endl;

  std::ofstream ofs(argv[1]);
  boost::archive::binary_oarchive ar(ofs);
  ar << t;
}

当我构建此代码(使用g ++ -std = c ++ 14 -o test_template test_template.cpp -lboost_system -lboost_serialization)时,出现以下错误(在“必填项”的普通近乎无限列表之后),< / p>

/usr/include/boost/serialization/access.hpp:118:9: error: ‘class std::shared_ptr<TestArtifact>’ has no member named ‘serialize’
         t.serialize(ar, file_version);

告诉我我的SFINAE设置不正确。当我将注释掉的行换成专用于std::shared_ptr<T>时,代码将按预期的方式构建和运行,但是我不想踩踏标准的Boost共享指针序列化专用化。当我使用过于笼统的专业知识运行并打印std::shared_ptr<TestArtifact>的类型ID和SFINAE类的输出时,它们是相同的(对于此编译器,我得到的输出为 St10shared_ptrI12TestArtifactE),所以我不明白为什么我的SFINAE序列化功能没有得到认可。

1 个答案:

答案 0 :(得分:2)

问题在于无法在这里推论 optimx(par=c(5,5), Lik1, basis=basis1,method='bobyqa',control = list(maximize=TRUE))

不要将T放在函数参数中,而应将其放在单独的模板参数中。

std::enable_if