相关疑难解决方法(0)

什么是monad?

最近简要介绍了Haskell,对于monad本质上是什么,简单,简洁,实用的解释是什么?

我发现我遇到的大多数解释都是相当难以接近的,缺乏实际细节.

monads haskell functional-programming terminology

1373
推荐指数
28
解决办法
23万
查看次数

boost是否具有比STL更简单的set操作的数据类型?

我发现使用C++ STL方法进行简单的集合操作非常笨重.例如,要找到两组之间的差异:

std::set<int> newUserIds;
set_difference(currentUserIds.begin(), currentUserIds.end(), mPreviousUserIds.begin(), mPreviousUserIds.end(), std::inserter(newUserIds, newUserIds.end()));
std::set<int> missingUserIds;
set_difference(mPreviousUserIds.begin(), mPreviousUserIds.end(), currentUserIds.begin(), currentUserIds.end(), std::inserter(missingUserIds, missingUserIds.end()));
mPreviousUserIds = currentUserIds;
Run Code Online (Sandbox Code Playgroud)

boost是否提供了一组替代类,可以将上面的示例缩小为:

set_type<int> newUserIds = currentUserIds.difference(mPreviousUserIds);
set_type<int> missingUserIds = mPreviousUserIds.difference(currentUserIds);
Run Code Online (Sandbox Code Playgroud)

(类似于Qt中的QSet,它operator-以这种方式覆盖.)

c++ boost stl set

26
推荐指数
2
解决办法
3964
查看次数

元编程:函数定义失败定义了一个单独的函数

这个答案中,我根据类型的is_arithmetic属性定义了一个模板:

template<typename T> enable_if_t<is_arithmetic<T>::value, string> stringify(T t){
    return to_string(t);
}
template<typename T> enable_if_t<!is_arithmetic<T>::value, string> stringify(T t){
    return static_cast<ostringstream&>(ostringstream() << t).str();
}
Run Code Online (Sandbox Code Playgroud)

dyp建议,不是is_arithmetic类型的属性,是否to_string为类型定义是模板选择标准.这显然是可取的,但我不知道如何说:

如果std::to_string未定义,则使用ostringstream重载.

声明to_string标准很简单:

template<typename T> decltype(to_string(T{})) stringify(T t){
    return to_string(t);
}
Run Code Online (Sandbox Code Playgroud)

这与我无法弄清楚如何构建的标准相反.这显然不起作用,但希望它传达了我正在尝试构建的内容:

template<typename T> enable_if_t<!decltype(to_string(T{})::value, string> (T t){
    return static_cast<ostringstream&>(ostringstream() << t).str();
}
Run Code Online (Sandbox Code Playgroud)

c++ templates result-of sfinae template-meta-programming

26
推荐指数
4
解决办法
2030
查看次数