函数应该接受任何容器,但返回容器内类型的列表

时间:2019-06-09 11:25:15

标签: c++ sfinae

我创建了一个函数,该函数需要一个函数指针列表功能,如function_creater所示,并返回一个列表功能。

我正在尝试删除std::list<>作为输入参数的一部分,该位置应接受任何任意容器,例如

funciton_creater(std::function<some_container<std::function<void(T&)>>(T&)> trans_func)

template <typename T>
std::function<std::list<T>(T&)> funciton_creater(std::function<std::list<std::function<void(T&)>>(T&)> trans_func){
    return [trans_func](T& state) {
        auto transitions = trans_func(state);
        std::list<T> new_states{};
        for (auto&& trans : transitions) {
            auto succ = state;
            trans(succ);
            new_states.push_back(succ);
        };
        return new_states;
    };
}

对于这种结构,我一直在尝试使用Sfinae,目前我在这里使用:

template <typename T, typename = void> // primary declaration
struct is_container : std::false_type {}; // when all specializations fail

template <typename T>
struct is_container< // specialization  
    T, // conditions:
    std::void_t<decltype(std::begin(std::declval<T&>()))>
> : std::true_type
{};
template <typename C>  // *_v value
constexpr auto is_container_v = is_container<C>::value;

我的问题是我无法构造std::enable_if语句来检查std::function是否包含容器。

0 个答案:

没有答案