我可以在类中存储构造函数的模板参数吗?
Can I store template parameter of a constructor inside the class
类不是模板,只有构造函数是,例如:
struct S{
template<typename LAMBDA>
S(LAMBDA lambda_obj){...};
void f(){
//I want to use lambda_obj here,
//but dont know how to do it
}
};
有什么方法可以将lambda_obj存储在结构中,然后稍后在 f(( 中使用它? 我不能使 S 成为模板。如果可以的话,那会容易得多。 我在测试中遇到了这个问题,我认为这很有趣。
谢谢你的回答!
如果您知道将用于构造 S 的可调用类型的签名,则可以将传递给构造函数的参数存储在 std::function 中,如下所示:
#include <iostream>
#include <functional>
struct S {
std::function<void(void)> func;
template<typename LAMBDA>
S(LAMBDA lambda_obj) {
func = lambda_obj;
};
void f() {
func();
}
};
void DoSomething()
{
std::cout << "foobarn";
}
int main()
{
S s(DoSomething);
s.f();
}
如果你不知道签名,你可以使用可变参数模板和类型擦除来完成——基本上你可以按照 std::function 本身的实现方式来做到这一点,尽管在这种情况下,成员函数 f 必须是函数模板和构造函数。
No.如果不进行template class S
,就无法存储lambda_obj
。
但是,通常不需要将构造函数单独设置为模板,尤其是在此方案中。从名称来看,我假设您可能正在传递一个 lambda 函数。如果它具有类似的签名,则按如下方式接收它:
struct S {
std::function<void(int)> m_lambda; // `void(int)` only for demo; can be any type
S (std::function<void(int)> lambda_obj) : m_lambda(lambda_obj) {}
void f () { m_lambda(3); }
};
相关文章:
- C++:使用运算符 = 调用多参数构造函数
- 通过零参数构造函数创建的 glm::mat4 应该包含哪些值?
- 好奇的混合与可变参数构造函数
- 具有默认值的单个参数构造函数是否与默认构造函数相同?
- 为什么我们需要创建一个单参数构造函数来使用临时的无名称对象
- 在可变参数构造函数中初始化常量数组
- C++ 显式多参数构造函数歧义
- 零一参数构造函数
- 可变参数构造函数中的 SFINAE
- 当没有显式关键字与单参数构造函数一起使用时,编译器可以发出警告
- 可变参数类模板和可变参数构造函数
- 确保模板参数类型与其可变参数构造函数的类型匹配
- C++默认参数构造函数与内联初始化优先级
- 如何在 c++ 中将包含复制构造函数的类的参数构造函数称为私有?
- 自动存储中没有无参数构造函数的类对象和异常
- 警告:用两个参数构造函数返回对象时,表达结果未使用
- 如何在C++中调用无参数构造函数
- 在 c++ 中具有多个参数构造函数的模板类存在问题
- 可变参数构造函数优先于用户提供的移动构造函数,除非默认
- 如何从可变参数构造函数参数构造任何对象?