在类成员函数中是否有任何技术或编译器扩展关键字来声明类成员变量?像
struct test_t{
void operator ()(){
instance_local int i = 0;
}
};
我想到的最好的方法是使用thread_local
,然后在另一个线程中执行成员函数,但这太难看了而无用。
编辑:示例
对于以下可能令人困惑的示例,我感到非常抱歉(与昨天的问题Is there any problem in jumping into if(false) block?有关)。我真的尽力减少混淆...
#include <iostream>
#define instance_local thread_local
struct A{
A(int i) :
i(i)
{
}
void dosomethinguseful(){
std::cout << i << std::endl;
}
int i;
};
struct task1{
int part;
task1() : part(0){}
void operator ()(){
int result_of_calculation;
switch (part) {
case 0:{
//DO SOME CALCULATION
result_of_calculation = 5;
instance_local A a(result_of_calculation);
if(false)
case 1:{ a.dosomethinguseful();}
part++;
}
default:
break;
}
}
};
int main(){
task1 t;
t();
t();
return 0;
}
instance_local A a(result_of_calculation);
就是我可以从这样的关键字获得的,而不是为a
创建智能指针。
答案 0 :(得分:1)
没有。编译器需要了解类的结构,而无需编译所有方法的实现。如果您可以将instance_local int foo
放到方法主体中,那将使数据结构的大小增大4个字节。
从原则上讲,隐藏数据不是很好。您可能会想到的全局变量的等效功能(静态局部变量)是C的遗留物,被广泛认为是反模式: Why are static variables considered evil?
答案 1 :(得分:1)
您正在描述一个协程。这是它的外观的粗略草稿(我不是协程专家)
auto task1() -> some_awaitable_type {
result_of_calculation = 5;
A a(result_of_calculation);
co_yield;
a.dosomethinguseful();
}
可以这样称呼:
some_awaitable_type maybe_do_something = task1();
// calculation done here
// dosomethinguseful called here
co_await maybe_do_something();
答案 2 :(得分:0)
不直接,不。
您可以定义一个:
static std::map<test_t*, int> is;
…每个元素的第一部分是一个this
指针。
但是,为什么?
制作一个成员变量。