C ++ enable_if模板类方法,如果它是std :: vector <std :: vector <type>&gt;

时间:2016-05-02 23:17:10

标签: c++ vector stl

我为接收Public Function GetNums(src As String) As String Dim arr Dim i As Integer Dim result As String arr = Split(src, ";#") ' Split the string to an array. result = "" For i = 1 To UBound(arr) Step 2 ' Loop through the array, starting with the second item, and skipping one item (using Step 2). result = result & arr(i) & ", " Next If Len(result) > 2 Then GetNums = Left(result, Len(result) - 2) ' Remove the extra ", " at the end of the the result string. Else GetNums = "" End If End Function 的结构实现flatten()方法。

我希望std::vector方法仅在使用flatten()构建MyStruct时才可用,而不是在使用std::vector<std::vector<Type>>构建时{和} { {1}}当然不是std::vector<Type>

除了CLANG之外,它确实设法让它发挥作用。 根据我的实施方式,我会得到不同的错误。

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

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

std::vector

1 个答案:

答案 0 :(得分:3)

为什么你需要enable_if?简单的ol&#39;类型扣除适合您:

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

编辑:对于您更新的问题,您真的很可能想在这里使用非成员。对于您的客户来说,它是一个更简单的API,并且鉴于此事情正在做什么,flatten可能不需要访问MyStruct的私有位,如果它不需要访问私有位,它应该是非会员非朋友。

如果出于某种原因你想做这件事,你可以使用自由函数为它编写一个特征,然后在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 {};
    }
};