2015-09-23 20 views
7

Vektörde bir tür silinen türden bir alıcıya erişmek istiyorum. Alıcı, const olarak işaretlenmiştir. Her nasılsa, konstrüksiyon, boost :: herhangi bir sarmalayıcı nesnesine yayılmaz. Sadece auto& x için-döngü değiştirilir kez BununlaHerhangi bir const üye işleviyle herhangi birini boost type_erasure

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 diyerek hatayla minimum örnek

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

sonuç, işe yarıyor. Bunun nedeni nedir ve sarmalayıcı nesnesinin sıkılığa saygı duymasını nasıl sağlayabilirim?

cevap

2

Böyle kavramında const-lik belirtmek gerekir:

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

belgelerinde 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'; 
    } 
} 
Bulundu

Baskılar

5 
+0

Bu şekilde denediğimden emindim. Muhtemelen, 'const _self' vektörünün dışına koydu. Çok teşekkürler! –

+0

@KevinDungs, bu sorudan bahsetmiş olmalısınız :) Dokümanlarda bu bitkiye girmeden önce kaynağında ne kadar zaman harcadığımı itiraf etmek istemem. – sehe

İlgili konular