c++ - 在忽略默认参数的情况下从 lambda 函数中的模板参数调用静态函数

标签 c++ lambda c++11

好的,我正在使用 Visual Studio 2010 来处理模板中的 lambda。 VC++ 在处理模板参数时有一个奇怪的怪癖,但我找到了一种使用 auto 关键字调用模板参数(本例中为 T::magic)的静态函数的解决方法。然而,我遇到了另一个问题。

假设我有一个具有“魔法”函数的类,只有前 2 个参数对我稍后的调用很重要。在前 2 个之后,它可能有也可能没有一些默认参数。对于这个应用程序,我并不真正关心它们,我只需要调用 magic(start, otherthing)。 Uhoh 是这些类之一:

struct Uhoh
{
 static int magic(char* start, int otherthing, bool doom = false);
}

我用这个模板打电话。我必须使用一种变通方法,即使用自动类型来获取 T::magic 以使其在 lambda 函数中工作。

template<typename T> void example()
{
 auto themagic = T::magic;

 std::function<int (char*)> test = [=](char* start) -> int
 {
  return themagic(start, 0);
 };

 test(0);
}

然后我称之为它或其他任何东西。

int main()
{
 example<Uhoh>();
}

我收到关于“调用参数太少”的错误,即使“magic”可以接受两个参数。现在,我无法确定在任何各种“魔术”功能中“其他”的类型是什么。我所知道的是 0 将是一个有效值。将任何其他东西的类型传递给函数“example”充其量是一种极度烦恼。

我怎样才能正确输入“themagic”以便 VC++ 不会抛出错误?

最佳答案

auto themagic = T::magic;

这里T::magic的第三个参数有默认值的信息丢失了,因为themagic的类型被推断为int (*) (char*, int, bool)不能为第三个参数设置任何默认值。所以你不能只用两个参数调用 themagic。您还必须传递第三个参数。

那么这样做:

std::function<int (char*)> test = [=](char* start) -> int
{
  return themagic(start, 0, false);
};

请注意,函数参数的默认值不是函数签名的一部分,这意味着当您编写

auto themagic = T::magic;

那么 themagic 的类型 不能 被推断为 int (*)(char*, int, bool=false)

关于c++ - 在忽略默认参数的情况下从 lambda 函数中的模板参数调用静态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8113642/

相关文章:

c++ - 跨目标传播库依赖性

c# - 如何使用 lambda 或 linq 订购 asc/dsc

c++ - std::this_thread::sleep_for() 和 GCC

c++ - Sublime 上的 EasyClangComplete 有什么用?

c++ - vector 、结构和 std::find

c++ - 友元模板函数的正确语法

c# - 有关转换 Func<T,T> 和 Expression<Func<T,T>> 的更多信息

c++ - =default 和没有参数的空构造函数之间的区别?

c++ - 将指针保存为 const 与传递值

haskell - 为什么 Haskell 在函数组合后不接受参数?