C++ Boost type_使用const成员函数擦除任意
我想访问向量中已擦除类型的getter。getter标记为const。不知何故,常量不会传播到boost::any包装器对象。最小的例子C++ Boost type_使用const成员函数擦除任意,c++,c++11,boost,boost-type-erasure,C++,C++11,Boost,Boost Type Erasure,我想访问向量中已擦除类型的getter。getter标记为const。不知何故,常量不会传播到boost::any包装器对象。最小的例子 #include <iostream> #include <vector> #include <boost/mpl/vector.hpp> #include <boost/type_erasure/any.hpp> #include <boost/type_erasure/member.hpp>
#include <iostream>
#include <vector>
#include <boost/mpl/vector.hpp>
#include <boost/type_erasure/any.hpp>
#include <boost/type_erasure/member.hpp>
using namespace boost;
using namespace boost::type_erasure;
BOOST_TYPE_ERASURE_MEMBER((has_test), test, 1)
using AnyTest = any<mpl::vector<copy_constructible<>,
has_test<int(double)>,
relaxed>>;
struct ATest {
int test(double x) const {
return 5;
}
};
int main() {
auto xs = std::vector<AnyTest>{};
xs.push_back(ATest{});
for (const auto& x : xs) {
std::cout << x.test(42.0) << '\n';
}
}
#包括
#包括
#包括
#包括
#包括
使用名称空间boost;
使用名称空间boost::type_擦除;
BOOST类型擦除成员((has测试),测试,1)
使用AnyTest=any;
结构测试{
整数测试(双x)常数{
返回5;
}
};
int main(){
autoxs=std::vector{};
xs.推回(ATest{});
for(const auto&x:xs){
std::cout您需要在概念中指定常量,如下所示:
using AnyTest = any<mpl::vector<
copy_constructible<>,
has_test<int(double), const _self>, relaxed>
>;
我确信我已经这样尝试过了。可能把const\u self
放在向量之外。非常感谢!@KevinDungs你应该在问题中提到它:)我不想承认在文档中遇到那个位之前,我浪费了多少时间清理源代码
using AnyTest = any<mpl::vector<
copy_constructible<>,
has_test<int(double), const _self>, relaxed>
>;
// http://stackoverflow.com/questions/32743594/boost-type-erasure-any-with-const-member-function
#include <iostream>
#include <vector>
#include <boost/mpl/vector.hpp>
#include <boost/type_erasure/any.hpp>
#include <boost/type_erasure/member.hpp>
using namespace boost;
using namespace boost::type_erasure;
BOOST_TYPE_ERASURE_MEMBER((has_test), test, 1)
using AnyTest = any<mpl::vector<
copy_constructible<>,
has_test<int(double), const _self>, relaxed>
>;
struct ATest {
int test(double) const { return 5; }
};
int main() {
auto xs = std::vector<AnyTest>{};
xs.push_back(ATest{});
for (auto const &x : xs) {
std::cout << x.test(42.0) << '\n';
}
}
5