gpt4 book ai didi

c++ - 使用类构造函数作为可调用对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:34 26 4
gpt4 key购买 nike

class C {
public:
C() {}
};

template<typename T>
void func(T f) {}

int main() {
func(C);
}

如何修复编译错误“2.cpp:9:15: error: expected primary-expression before ‘)’ token 函数(C);"?

将类作为参数传递似乎很荒谬,但我想像线程一样编译函数,因为“线程(C)”工作正常:

#include <thread>

class C {
public:
C() {}
};

template<typename T>
void func(T f) {}

int main() {
std::thread(C);
}

最佳答案

不幸的是,one cannot take address of a constructor在 C++ 中。意思是,您不能简单地采用“指向构造函数的指针”并将其用作仿函数(就像您对自由函数或成员函数所做的那样)。

你实际上不能“传递一个类”作为参数,因为 C++ 核心没有反射,如果你在运行时得到“一个类”,你不能用它做任何事情。您只能“传递一个类”作为模板参数。

不过,您可以做的是简单地使用将调用相应构造函数的 lambda 函数:

class C {
public:
C() {}
};

template<typename T>
void func(T f) {
auto c_instance = f();
}

int main() {
func([](){ return C(); });
}

请注意,您仍然没有在运行时传递任何内容 - lambda 的返回类型 [](){ return C(); 在编译时已知,因此 auto c_instance 的类型在编译时也是已知的。

但是,我认为如果您不需要将任何其他用于 C 的工厂传递给 func,只需在 func 中创建实例> 会更清楚:

class C {
public:
C() {}
};

template<typename T>
void func() {
T c_instance;
}

int main() {
func<C>();
}

关于 std::thread(c);

std::thread(C);

不是函数调用。 std::thread 是一种类型。因此,它声明了一个名为C 的局部变量。使用

auto a = std::thread(C);

应该会产生类似的编译器错误。

关于c++ - 使用类构造函数作为可调用对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44491995/

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