按类型获取元组元素(前C ++ 0x)

时间:2013-09-15 12:56:22

标签: c++ visual-studio-2010 c++11 template-meta-programming boost-tuples

我有一个模板化的类,它包含一个元组,并希望能够在编译时按类型检索元素。为简化起见,容器类最多只能有三个条目:

template< class U = null_type, class V = null_type, class W = null_type >
class TupleContainer {
public:

    template< class ReturnT >
    ReturnT& getElementbyType() {
        return get< ReturnT >(data_);
    }

private:
    boost::tuple< U, V, W > data_;
}

阅读Get index of a tuple element's typeFor std::tuple, how to get data by type, and how to get type by index?的答案我通过递归访问者方法实现了这一点,并且使用具有c ++ 11功能的GNU C ++编译器就可以正常工作。

template< int Index, class Search, class First, class... Types >
struct get_internal
{
    typedef typename get_internal< Index + 1, Search, Types...>::type type;
    static constexpr int index = Index;
};

template< int Index, class Search, class... Types >
struct get_internal< Index, Search, Search, Types... >
{
    typedef get_internal type;
    static constexpr int index = Index;
};

template< class T, class... Types >
T& get( std::tuple< Types... >& tuple )
{
    return std::get< get_internal< 0, T, Types... >::type::index >(tuple);
}

我现在必须将代码移植到Windows。由于某些外部库的限制,我必然会使用似乎不支持可变参数模板的Visual Studio 2010。

我确信有一个解决方法(因为boost :: tuple也可以在没有可变参数模板的支持下使用)但我仍然是这个整个模板元编程主题的新手,还没有找到解决方案。

在Visual Studio 2010中没有可变参数模板的情况下,是否有人知道解决此问题的方法?

顺便说一句:即使元组远远超过三个元素,访问者方法也能很好地工作。容器将被限制为3或4个元组元素,所以我甚至不介意将索引硬编码到我的实现中。

1 个答案:

答案 0 :(得分:1)

您不需要预处理器来生成大量重载,只需调整您的get_internal方法即可在没有可变参数模板的情况下工作。他们需要有类似数量的参数,例如TupleContainer

template< class R, class U, class V, class W >
struct getIndex
{
    static const int value = getIndex< R, V, W, null_type >::value + 1;
};

template< class R, class V, class W >
struct getIndex< R, R, V, W >
{
    static const int value = 0;
};

template< class R >
struct getIndex< R, null_type, null_type, null_type >
{
    // let it fail if the type is not found and avoid infinite recursion
};

现在你可以使用

template< class R >
R& getElementByType() {
    return get< getIndex< R, U, V, W >::value >(data_);
}