【问题标题】:Calling a static function from a template parameter in a lambda function while ignoring default parameters从 lambda 函数中的模板参数调用静态函数,同时忽略默认参数
【发布时间】:2011-11-13 18:21:15
【问题描述】:

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

我使用此模板进行通话。我必须使用使用 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>();
}

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

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

【问题讨论】:

    标签: c++ lambda c++11


    【解决方案1】:
    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)

    【讨论】:

    • 我明白了。我正在寻找一种不丢失它的方法(可能使用函数?),但同时不知道我将使用的第二个参数的类型。默认参数可能因不同的“魔术”功能而异。我无法设置为只使用它的一个实例。
    • @user173342" 否。函数类型无法存储该值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2015-07-08
    • 1970-01-01
    相关资源
    最近更新 更多