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

标签 c++ vector stl

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

相关文章:

c++ - WMI 数据问题

c++ - 当您增加 vector 中结构的大小时会发生什么?

c++ - 如何在给定宽度和高度的情况下调整对象的二维 vector 的大小?

c++ - 在 C++ (STL) 的结构中声明的方法

c++ - 打印整数指针 vector 的值

c++ - return 语句是否为按值返回的函数创建一个临时对象?

c++ - 在C++中删除特定的预取文件

R:删除向量的数量

c++ - 使用 vector 时,pop_back 是否会连同元素一起删除值?

c++ - 选择合适的 STL 容器来记录数据