从lambda函数中的模板参数调用静态函数,同时忽略默认参数

时间:2011-11-13 18:21:15

标签: c++ lambda c++11

好的,我正在使用Visual Studio 2010在模板中弄乱lambda。 VC ++有一个奇怪的怪癖处理模板参数,但我找到了一个解决方法,通过使用auto关键字调用模板参数的静态函数(在本例中为T :: magic)。但是,我又遇到了麻烦。

假设我有许多具有“魔术”功能的类中的一个,并且前两个参数只对我的调用很重要。它可能会或可能没有一些默认参数在第一个2.我真的不关心他们这个应用程序,我只需要调用魔术(开始,otherthing)。 Uhoh是这些课程之一:

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

我使用此模板进行调用。我必须使用使用auto类型的解决方法来获取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>();
}

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

如何正确输入“themagic”以便VC ++不会抛出错误?

1 个答案:

答案 0 :(得分:2)

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)