我创建了一个函数,该函数需要一个函数指针列表功能,如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
是否包含容器。