好的,我正在使用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 ++不会抛出错误?
答案 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)
。