【问题标题】:C++ use lambda function as template function specializationC++ 使用 lambda 函数作为模板函数特化
【发布时间】:2017-09-22 13:45:45
【问题描述】:

是否可以使用 lambda 函数来创建模板类函数的别名?像这样的:

#include <iostream>
using namespace std;

int calcDouble(int a) { return a * 2; }
int calcMultiply_10(int a) { return a * 10; }

struct foo
{
    template<void (*func)(int)>
    int generic(int value)
    {
        return func(value);
    }

    static auto double_10 = [this] { generic<calcDouble>(10); };
    static auto double_20 = [this] { generic<calcDouble>(20); };
    static auto multiply_10_20 = [this] { generic<calcMultiply_10>(20); };
}


int main() {
    foo f;

    cout << "double_10: " <<f.double_10() << endl;
    cout << "double_20: " <<f.double_20() << endl;
    return 0;
}

【问题讨论】:

  • 没有为静态成员定义“this”。

标签: c++ c++11 templates lambda


【解决方案1】:

您的特定示例无法编译,如果编译将很危险 - 按值捕获 this 意味着一旦复制/移动类,捕获的 this 将指向错误或无效的内存位置.

只使用成员函数:

auto double_10()      { return generic<calcDouble>(10); }
auto double_20()      { return generic<calcDouble>(20); }
auto multiply_10_20() { return generic<calcMultiply_10>(20); }

live example on wandbox

【讨论】: