gpt4 book ai didi

C++ - 指定模板值类型

转载 作者:行者123 更新时间:2023-12-05 09:35:16 25 4
gpt4 key购买 nike

我有这个功能

// Helper to determine whether there's a const_iterator for T.
template <typename T>
struct hasConstIt {
private:
template<typename C> static char test(typename C::const_iterator*);
template<typename C> static int test(...);
public:
enum { value = sizeof(test<T>(0)) == sizeof(char) };
};

// Check if a container contains an element.
template <typename Container, typename = std::enable_if_t<hasConstIt<Container>::value> >
bool contains(const Container & container, typename Container::value_type const & element) {
return std::find(container.begin(), container.end(), element) != container.end();
}

如何指定容器值类型必须是特定类型?假设我希望容器包含 int , 那么有效容器可以是 vector<int> , deque<int>

最佳答案

您可以使用 std::is_same 来检查类型是否与指定类型完全相同。如果您想同时检查这两个条件,您可以简单地在 std::enable_if 条件中使用逻辑运算符:

template <typename Container, typename = std::enable_if_t<
(std::is_same<typename Container::value_type, int>::value &&
hasConstIt<Container>::value)
> >
bool contains(const Container & container, typename Container::value_type const & element) {
return std::find(container.begin(), container.end(), element) != container.end();
}

与其他答案相反,这是 SINAE 友好的。但是,如果您只想确保它不会在用户犯错时编译,我会选择其他解决方案,因为它会给您更好的错误消息。

示例 here .

如果可以使用 C++20,则可以使用 requires 来限制模板类型。这既对 SFINAE 友好,又能给你一个很好的错误信息。

template<typename Container>
requires (
requires {
typename Container::const_iterator;
typename Container::value_type;
}
&& std::same_as<typename Container::value_type, int>
)
bool contains (const Container & container, typename Container::value_type const & element) {
return true;
}

或者,如果您需要约束多个函数,您可以定义一个概念

template<typename Container>
concept good_container =
requires(Container c) {
typename Container::const_iterator;
typename Container::value_type;
}
&& std::same_as<typename Container::value_type, int>;

template<good_container Container>
bool contains (const Container & container, typename Container::value_type const & element) {
return true;
}

示例 here .

关于C++ - 指定模板值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65950762/

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