C++ 虐我千百遍
109 subscribers
31 photos
7 links
Download Telegram
想要一个功能:#define 里面能根据参数字符串的开头,dispatch 到不同的 #define 里面
Lancern's Treasure Chest
P3312: Overload Set Types 目前,如下的代码片段无法编译: std::vector<float> v = {1, 2, 3, 4}; std::ranges::transform(v, v.begin(), std::sin); 这是因为 std::sin 具有多个重载: float sin(float); double sin(double); long double sin(long double); template <typename T> double sin(T);…
对这个问题,我曾经有个 workaround 是
#define FN(f...) [&]<typename... Args>(Args&&... args)->decltype(auto){return (f)(std::forward<Args>(args)...);}

但是这有个问题,比如还是用 sin 举例,那么 requires { FN(sin)(1, 2) } 会得到一个 true,但实际上 sin 不能支持多个参数调用
隔壁群主 @lancern 给出了一个更强的 workaround 能解决这个问题,让我们一起领略现代 C++ 的美感!
Forwarded from Lancern🧧
#define FN(f) \
[&]<typename ...Args>(Args &&...args) -> decltype(auto) \
requires requires { (f)(std::forward<Args>(args)...); } \
{ return (f)(std::forward<Args>(args)...); }