我在标准n4296(草案)§1.8第7页中读到:
一个对象是存储的区域.[注意:函数不是对象,无论它是否以对象的方式占用存储. - 尾注]
我在网上花了几天寻找这种排斥的充分理由,没有运气.也许是因为我不完全理解对象.所以:
假设我有以下包含lambda的变量:
auto a = [] { return true; };
Run Code Online (Sandbox Code Playgroud)
我想稍后a回来false.我可以按照这个方针做点什么吗?
a = [] { return false; };
Run Code Online (Sandbox Code Playgroud)
此语法给出了以下错误:
binary '=' : no operator found which takes a right-hand operand of type
'main::<lambda_a7185966f92d197a64e4878ceff8af4a>' (or there is no acceptable conversion)
IntelliSense: no operator "=" matches these operands
operand types are: lambda []bool ()->bool = lambda []bool ()->bool
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这样的事情?我想将auto变量更改为不同的lambda.我是一个初学者,所以我可能会错过一些关于autolambdas的知识.谢谢.
我正在研究提升线程.我发现线程类有一个接受可调用对象的构造函数.什么是可调用对象?
class CallableClass
{
private:
// Number of iterations
int m_iterations;
public:
// Default constructor
CallableClass()
{
m_iterations=10;
}
// Constructor with number of iterations
CallableClass(int iterations)
{
m_iterations=iterations;
}
// Copy constructor
CallableClass(const CallableClass& source)
{
m_iterations=source.m_iterations;
}
// Destructor
~CallableClass()
{
}
// Assignment operator
CallableClass& operator = (const CallableClass& source)
{
m_iterations=source.m_iterations;
return *this;
}
// Static function called by thread
static void StaticFunction()
{
for (int i=0; i < 10; i++) // Hard-coded upper limit
{ …Run Code Online (Sandbox Code Playgroud) 基本上我想这样做: 我可以使用lambda函数或std :: function对象代替函数指针吗?
显然,对于期望函数指针的函数来说,现在是不可能的.但是,它适用于需要仿函数的函数(我之前使用过stl的sort()函数)
但是,我不知道如何编写一个以仿函数为参数的函数!
任何人?
使用函子和函数指针有什么区别.例如
//Functor
struct add_x
{
int x;
add_x(int y):x(y){}
int operator()(int y)
{
return x+y;
}
};
//Function
int (func)(int x)
{
return ++x;
}
std::vector<int> vec();
//fill vec with 1 2 3 4 5
int (*f)(int) = func;//Function pointer
std::transform(vec.begin(),vec.end(),f); //approach 1
std::transform(vec.begin(),vec.end(),add_x(1)); //approach 2
Run Code Online (Sandbox Code Playgroud)
这两种方法都有效,但我确信会有一种方法比其他方法更受欢迎(或可能).
gcc中有一个魔术变量,它持有一个指向当前函数的指针吗?
我想有一种表包含每个函数指针的一组信息.
我知道有一个__func__变量包含当前函数的名称作为字符串但不作为函数指针.
这不是为了调用函数而是仅仅用作索引.
编辑 基本上我想做的是能够在执行当前函数之前运行嵌套函数(并且还捕获返回以执行某些操作.)基本上,这就像__cyg_profile_func_enter和__cyg_profile_func_exit(检测函数).但问题是这些仪器功能是全局的而不是功能专用的.
编辑
在Linux内核中,你可以使用unsigned long kallsyms_lookup_name(const char *name)从include/linux/kallsyms.h...请注意CONFIG_KALLSYMS选项必须被激活.
我看到函数对象经常与STL算法一起使用.功能对象是否因为这些算法而出现?你什么时候在C++中使用函数对象?它的好处是什么?
我最近问了一个关于从矢量中删除项目的问题.好吧,我得到的解决方案,但我不明白 - 我找不到任何解释它的文档.
struct RemoveBlockedHost {
RemoveBlockedHost(const std::string& s): blockedHost(s) {}
// right here, I can find no documentation on overloading the () operator
bool operator () (HostEntry& entry) {
return entry.getHost() == blockedHost || entry.getHost() == "www." + blockedHost;
}
const std::string& blockedHost;
};
Run Code Online (Sandbox Code Playgroud)
用作:
hosts.erase(std::remove_if(hosts.begin(), hosts.end(), RemoveBlockedHost(blockedhost)), hosts.end());
Run Code Online (Sandbox Code Playgroud)
我查看了std :: remove_if的文档,它说只有在类重载()运算符时才可以传递一个类而不是一个函数.没有任何信息.
有谁知道链接:
对此的帮助将不胜感激.我不喜欢在我的软件中添加代码,除非我理解它.我知道它有效,而且我(稍微)熟悉运算符重载,但我不知道()运算符是什么.
在C++标准模板库中,有一个"功能"部分,其中许多类使其()运算符超载.
在C++中使用函数作为对象是否带来任何便利?
为什么我们不能只使用函数指针呢?任何例子?
我想创建一个通用函数,它返回一个函数指针,指向C/C++中的另一个函数.但是,第二个返回的函数应该能够使用第一个函数的变量.
例,
typedef double (*func_t)(double);
func_t inverse(func_t fn) {
// define another function here that uses fn
double solve(double x) {
// use fn
}
return &solve;
}
double sqr(double x) { return x * x; }
int main() {
func_t inv = inverse(sqr);
printf("sqrt %d = %f\n", 100, inv(100));
}
Run Code Online (Sandbox Code Playgroud)
显然gcc,g ++不允许我这样做.我可以在不使用类或结构的情况下实现此目的.