C++ Boost type_使用const成员函数擦除任意

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>

我想访问向量中已擦除类型的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>

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