1

我正在尝试使用boost::mpl::inherit_linearly用户提供的类型来组成容器类:

#include <typeinfo>
#include <iostream>
#include <vector>

#include <boost/mpl/inherit.hpp>
#include <boost/mpl/inherit_linearly.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/vector.hpp>

namespace mpl = ::boost::mpl;

//////////////////////////////////////////////
// Create the container by chaining vectors
//////////////////////////////////////////////

struct Base {};

// Types provided by the user
typedef mpl::vector<int, char, double>::type myTypes;

typedef mpl::inherit_linearly<
    myTypes, 
    mpl::inherit<mpl::_1, std::vector<mpl::_2> >,
    Base
    >::type InheritedContainer;


// Function for accessing containers
template <typename T>
inline std::vector<T>& get_container(Base& c) {
    return static_cast<std::vector<T>& >(c);
}


// Some functions that manipulate the containers
//     NB: These functions only know about the Base and the types
//         they want to access

void my_int_func(Base& b) {
    get_container<int>(b).push_back(42);
}

void my_char_func(Base& b) {
    get_container<char>(b).push_back('c');
}

int main() {
    InheritedContainer container;
    Base& bref = container;

    my_int_func(bref);
    std::cout << "Int: " << get_container<int>(bref).back() << std::endl;

    my_char_func(bref);
    std::cout << "Char: " << get_container<char>(bref).back() << std::endl;

    return 0;
}

我得到的编译错误是:

question.cpp: In function ‘std::vector<T, std::allocator<_CharT> >& get_container(Base&) [with T = int]’:
question.cpp:40:   instantiated from here
question.cpp:31: error: invalid static_cast from type ‘Base’ to type ‘std::vector<int, std::allocator<int> >&’
question.cpp: In function ‘std::vector<T, std::allocator<_CharT> >& get_container(Base&) [with T = char]’:
question.cpp:44:   instantiated from here
question.cpp:31: error: invalid static_cast from type ‘Base’ to type ‘std::vector<char, std::allocator<char> >&’

不应该Base是由 产生的任何类型的基础inherit_linearly吗?如果是这样,avector<int>和其他向量不应该出现在类型层次结构中以便 static_cast 退出吗?

有没有其他方法可以获得这个功能?

4

1 回答 1

0

我认为Base是 的基类InheritedContainer,但不是 std::vector<int>。众所周知,std::vector不定义如下:

class vector : Base {...

您可能期望以下继承:

class InheritedContainer : Base, std::vector<int>, ... {...

但是,在这种情况下,从Baseto的转换vector<int>是交叉转换,因此不能用 来完成static_cast

如您所知,允许执行以下操作:

InheritedContainer container;
Base& bref = container;
InheritedContainer& iref = static_cast<InheritedContainer&>(bref);
std::vector<int>& vi = iref;
std::vector<char>& vc = iref;

如果您可以准备get_container,my_int_funcmy_char_func,则可能std::vector会事先知道将专门针对的类型。如果是这样,我认为持有InheritedContainer&而不是一直持有是相关的Base&
如果您必须转换Basevector<T>,可能是 RTTI(例如将虚函数添加到Basedynamic_cast并将启用转换。

于 2011-03-17T03:54:12.637 回答