- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
就我目前正在编写的库而言,我的目标是,在给定用户指定的 lambda 函数的情况下,使用我选择的参数在内部调用它。
到目前为止它工作正常,看起来像这样:
#include <tuple>
template<typename T> struct GetFinfos;
template<typename R, typename F, typename ...Args>
struct GetFinfos<R(F::*)(Args...) const> {
static std::tuple<Args...> createChosenTuple() {
return std::make_tuple(Args(1)...);
}
};
template<typename F>
void internal_lambda_call(const F & f) {
//let's suppose for convenience that we have a working call_from_tuple in C++14
std::apply(f, GetFinfos<decltype(&F::operator())>::createChosenTuple() );
}
int main()
{
auto f = [](int i, int j, int k) { };
internal_lambda_call(f); // calls f(1,1,1);
}
现在,C++14
引入了带有默认参数的 lambda 函数,我想知道库是否可以使用来自用户的这些额外信息。
auto g = [](int i, int j = 5, int k = 5) { };
据我了解,具有默认参数的 lambda 仍然只有一个 ClosureType::operator ret(*)(params)()
运算符。因此 GetFinfos
对默认参数视而不见,internal_lambda_call(g)
调用 g(1,1,1)
。
但是,由于我们可以访问完整的参数类型列表,理论上我们可以尝试使用减少数量的参数调用 lambda 并选择最后一个有效的参数。
g(1,1,1) //valid call
g(1,1) //valid call
g(1); //valid call <---- last valid one
g(); //invalid call
所以我的问题是:如果有任何现有机制,那么 internal_lambda_call(g)
会自动调用 g(1)
或 g(1,5, 5)
?我看到 here通用 lambda 可用于包装 lambda 并使其使用明确数量的参数。但我没有找到一种方法来自动获取最少数量的参数。
最佳答案
I don't see a way to get this minimal number of argument automatically.
也许……用一点递归和 SFINAE……
#include <tuple>
#include <utility>
template <typename F, typename T, std::size_t ... Is>
constexpr auto gmna_helper (std::index_sequence<Is...> is, int)
-> decltype( (void)std::declval<F>()
(std::declval<std::tuple_element_t<Is, T>>()...),
std::size_t{} )
{ return sizeof...(Is); }
template <typename F, typename T, std::size_t ... Is>
constexpr auto gmna_helper (std::index_sequence<Is...>, long)
{ return gmna_helper<F, T>(std::make_index_sequence<sizeof...(Is)+1u>{}, 0); }
template <typename F, typename ... Ts>
constexpr std::size_t getMinNumArgs ()
{ return gmna_helper<F, std::tuple<Ts...>>(std::index_sequence<>{}, 0); }
int main ()
{
auto g = [](int, int = 5, int = 5) { };
constexpr auto n = getMinNumArgs<decltype(g), int, int, int>();
static_assert( n == 1, "!" );
}
正如同一 OP 在评论中所说,两个 gmna_helper()
之间的签名差异,int
与 long
参数,是为了引入一个顺序:该函数是用 int
调用的,因此在可用时选择恰好接收 int
的版本。即:当类型为 F
的函数仅可使用第一个 sizeof...(Is)
参数调用时被选中。
否则,当 int
版本不可用时(SFINAE 因 decltype()
内的调用失败而被禁用)long
(永远可用)被选中。
关于c++ - 使用默认参数从 lambda 调用最少数量的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57253645/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!