2015-09-23 4 views
7

Я хочу получить доступ к получателю типов стираемых типов в векторе. Геттер помечен как const. Так или иначе, константа не распространяется на объект boost :: any wrapper. Минимальный примерBoost type_erasure any с функцией const member

#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'; 
    } 
} 

приводит к ошибке, говорящее

clang++ -O3 -std=c++14 minimal.cc -o minimal 
minimal.cc:28:18: error: member function 'test' not viable: 'this' argument has type 'const 
     boost::type_erasure::any<boost::mpl::vector<boost::type_erasure::copy_constructible<boost::type_erasure::_self>, has_test<int (double), 
     boost::type_erasure::_self>, boost::type_erasure::relaxed, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, 
     mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::type_erasure::_self>', but 
     function is not marked const 
    std::cout << x.test(42.0) << '\n'; 
       ^
minimal.cc:11:39: note: 'test' declared here 
BOOST_TYPE_ERASURE_MEMBER((has_test), test, 1) 
            ^
/opt/local/include/boost/type_erasure/member.hpp:133:9: note: expanded from macro 'BOOST_TYPE_ERASURE_MEMBER' 
     member,                    \ 
     ^
/opt/local/include/boost/type_erasure/member.hpp:242:64: note: expanded from macro 'BOOST_TYPE_ERASURE_MEMBER_I' 
    BOOST_TYPE_ERASURE_MEMBER_II(namespace_name, concept_name, member, N) 
                  ^
/opt/local/include/boost/type_erasure/member.hpp:170:44: note: expanded from macro 'BOOST_TYPE_ERASURE_MEMBER_II' 
     typename rebind_any<Base, R>::type member(            \ 
             ^
1 error generated. 
make: *** [minimal] Error 1 

Однако, как только const auto& x в для цикла изменяется на только auto& x, это работает. В чем причина этого и как я могу потребовать, чтобы объект-оболочка соблюдал константу?

ответ

2

Вы должны указать константный-ность в концепции, как это:

using AnyTest = any<mpl::vector< 
        copy_constructible<>, 
        has_test<int(double), const _self>, relaxed> 
        >; 

Найдено по документации page "Basic Usage"


Live On Coliru

// 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 
+0

Я был уверен, что пробовал это так. Вероятно, выведите «const_self» вне вектора. Большое спасибо! –

+0

@KevinDungs вы должны были упомянуть об этом в вопросе :) Я бы не хотел признавать, сколько времени я потратил на очистку через источник, прежде чем я столкнулся с этим битом в документах – sehe

Смежные вопросы