gpt4 book ai didi

c++ - 区分具有类型特征的结构

转载 作者:行者123 更新时间:2023-11-30 03:52:44 25 4
gpt4 key购买 nike

有没有办法区分struct它有一个 std::vector<T>来自任何其他类型?

我有一些模板函数,如果 T 应该专门化是一个包含 std::vector<T> 的结构所以我要找的是:

template<typename T> method(const T& object)
{
static_assert(!contains_vector<T>::value, "This method must be specialized");
// implementation
}

这样

struct Foo {
uint32_t foo;
float bar;
};

struct Bar {
uint16_t foo;
vector<float> bar;
}

contains_vector<float>::value == false;
contains_vector<Foo>::value == false;
contains_vector<Bar>::value == true;

我想弄清楚如何区分 <type_traits>这个区别。

最佳答案

在一般情况下,不会。 C++ 没有反射。所以如果你想写一个类型特征“这个任意的泛型结构是否包含一个 vector 成员?”,那是不可能的。

但是,如果您控制所有要测试的类型,则可以使用 BOOST_FUSION_ADAPT_STRUCT 对它们进行检测,这会增加反射:

BOOST_FUSION_ADAPT_STRUCT(
Foo,
(uint32_t, foo)
(float, bar)
)

BOOST_FUSION_ADAPT_STRUCT(
Bar,
(uint16_t, foo)
(std::vector<float>, bar)
)

这使您的结构 FooBar 的功能就好像它们是一开始的 boost::fusion 序列一样。之后,编写类型特征只涉及所有常见的 Boost Fusion 元编程技巧:

template <typename Seq>
struct contains_vector {
// metafunction class for checking if a type is a std::vector<T,A>
struct is_vector {
template <typename T>
struct apply : std::false_type { };

template <typename T, typename A>
struct apply<std::vector<T,A>> : std::true_type { };
};

// think std::find_if()
using iter = typename boost::fusion::result_of::find_if<Seq, is_vector>::type;
// think .end()
using end = typename boost::fusion::result_of::end<Seq>::type;

// if iter == end, it's not found, so have to flip the sign
using type = std::integral_constant<bool, !std::is_same<iter, end>::value>;
};

有了那个:

static_assert(contains_vector<Bar>::type::value, "");    // OK
static_assert(!contains_vector<Foo>::type::value, ""); // OK

请注意,我使用的是 find_ifend而不是使用 any ,因为作为元函数的那个​​总是返回 bool

关于c++ - 区分具有类型特征的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30513764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com