好的,我正在使用 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/