gpt4 book ai didi

C++ enable_if 模板类方法,如果它是 std::vector>

转载 作者:行者123 更新时间:2023-11-28 00:03:40 27 4
gpt4 key购买 nike

我正在实现 flatten()接收 std::vector 的结构的方法.

我想要 flatten()方法仅在 MyStruct 时可用由 std::vector<std::vector<Type>> 构成, 而不是在用 std::vector<Type> 构建时(当然,Type 不是 std::vector)。

它确实设法让它工作,除了 CLANG。根据我的实现方式,我会遇到不同的错误。

我想知道使用 enable_if 执行此操作的正确方法.

我的结构的签名应该类似于这样:

template <typename Type>
struct MyStruct {

...

// this should only exist if Type is an std::vector
MyStruct<Type::value_type> flatten() {
...
}

}

最佳答案

为什么你需要 enable_if?简单的 ol' 类型推导适合您:

template <typename T>
MyStruct<vector<T>> flatten(const MyStruct<vector<vector<T>>>& input) {
// ...
}

编辑:对于您更新的问题,您真的很可能想在这里使用非成员(member)。对于您的客户来说,它是一个更简单的 API,考虑到它正在做什么,flatten 可能不需要访问 MyStruct 的私有(private)位,如果它不需要访问私有(private)位,它应该是非成员非 friend 。

如果出于某种原因你想做这件事,你可以使用一个自由函数为它写一个特征,然后在里面使用 static_assert,类似于:

http://melpon.org/wandbox/permlink/W0NG1VxX4fuia8kM
或者
http://melpon.org/wandbox/permlink/UJZ7qliuAqXLSW4b

#include <vector>
#include <type_traits>

template <typename T>
std::false_type is_vector_of_vector_helper(const T&); // not defined
template <typename T>
std::true_type is_vector_of_vector_helper(const std::vector<std::vector<T>>&);

template <typename T>
using is_vector_of_vector_t = decltype(is_vector_of_vector_helper(std::declval<T>()));

template <typename T>
struct MyStruct {
MyStruct<typename T::value_type> flatten() const {
static_assert(is_vector_of_vector_t<T>::value,
"Flatten should only be called with MyStruct<vector<vector<T>>>");
// impl

return {};
}
};

关于C++ enable_if 模板类方法,如果它是 std::vector<std::vector<Type>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36993083/

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