gpt4 book ai didi

templates - 用于传递 lambda 的模板特化

转载 作者:行者123 更新时间:2023-12-01 11:56:15 25 4
gpt4 key购买 nike

我坚持为 lambda 专门化模板函数:

class X
{
public:
template <typename T>
void f(T t)
{
std::cout << "awesome" << std::endl;
};

template <>
void f(double t)
{
std::cout << "trouble" << std::endl; // Works
}

template <>
void f(??? t) // what to put here?
{
std::cout << "lambda" << std::endl;
}
};


X x;
x.f(42); // prints "awesome"
x.f(1.12); // prints "trouble"
x.f([](){ std::cout << "my lazy lambda" << std::endl; }); // should print "lambda"

在传递给 f 之前将 lambda 转换为 std::function 并专用于此类型是可行的,但编写起来很乏味。 C++0x 有解决方案吗?

编辑:我完全可以接受一个解决方案,如果传递 lambda 的最后一行有效,这将使我能够专注于可调用对象。

最佳答案

以下是 sizeof 技巧的变体。也许可以单独使用 decltype 来完成。它并不完全检查它是否是 lambda,而是检查它是否可调用。如果你想过滤掉其他可调用的东西,你可以使用 C++0x 类型特征来检查它们是否是函数、成员函数、复合对象等。

#include <functional>
#include <iostream>
#include <type_traits>

template<class T>
char is_callable( const T& t, decltype( t())* = 0 );

long is_callable( ... );

class X
{
public:
template <typename T>
void f( const T& t, typename std::enable_if<sizeof(is_callable(t)) !=1>::type* = 0 )
{
std::cout << "awesome" << std::endl;
};

void f(double )
{
std::cout << "trouble" << std::endl; // Works
}

template<class T>
void f( const T& t, typename std::enable_if<sizeof(is_callable(t)) == 1>::type* = 0 )
{
std::cout << "lambda" << std::endl;
}
};

int main(int argc, const char *argv[])
{
X x;
x.f(42); // prints "awesome"
x.f(1.12); // prints "trouble"
x.f([](){ std::cout << "my lazy lambda" << std::endl; }); // should print "lambda"
}

关于templates - 用于传递 lambda 的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6927874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com