我正在尝试使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序列化功能没有得到认可。
答案 0 :(得分:2)
问题在于无法在这里推论 optimx(par=c(5,5), Lik1,
basis=basis1,method='bobyqa',control = list(maximize=TRUE))
。
不要将T
放在函数参数中,而应将其放在单独的模板参数中。
std::enable_if