我正在实现 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/