在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
Using a class with a constructor as a type parameter in a template instantiation in c++
在C++ (14( 中,我有一个类型 T 的模板类,我想使用一个类作为类型。我想用于该类型的类需要其构造函数中的参数...那么如何通过模板实例化传递这个参数呢?
我的示例代码 (template_hell.cpp(:
#include <iostream>
template <typename T>
class my_template
{
public:
struct Stored_Data_Type
{
T data;
int set_count = 0;
};
my_template() : m_data() {};
T& write()
{
m_data.set_count++;
return m_data.data;
}
const T& get() const {return m_data.data;}
private:
Stored_Data_Type m_data;
};
class a_class
{
public:
a_class(int init): m_data(init) {};
void set(const int data) {m_data = data;};
const int get() const {return m_data;};
private:
int m_data;
};
class b_class : public a_class
{
public:
b_class(): a_class{0} {};
};
int main()
{
//a_class b(1);
b_class b;
b.set(2);
std::cout << "b: " << b.get() << std::endl;
my_template<int> my_int;
my_int.write() = 10;
std::cout << "my_int: " << my_int.get() << std::endl;
my_template<b_class> my_b;
my_b.write().set(2);
std::cout << "my_b: " << my_b.get().get() << std::endl;
// Compile error here:
my_template<a_class> my_a;
my_a.write().set(3);
std::cout << "my_a: " << my_a.get().get() << std::endl;
}
这一切都有效,并且在我添加my_a
模板实例之前很好。然后我得到这个编译错误:
template_hell.cpp: In instantiation of 'my_template<T>::my_template() [with T = a_class]':
template_hell.cpp:62:24: required from here
template_hell.cpp:13:26: error: use of deleted function 'my_template<a_class>::Stored_Data_Type::Stored_Data_Type()'
my_template() : m_data() {};
^
template_hell.cpp:7:10: note: 'my_template<a_class>::Stored_Data_Type::Stored_Data_Type()' is implicitly deleted because the default definition would be ill-formed:
struct Stored_Data_Type
^~~~~~~~~~~~~~~~
template_hell.cpp:7:10: error: no matching function for call to 'a_class::a_class()'
template_hell.cpp:31:3: note: candidate: a_class::a_class(int)
a_class(int init): m_data(init) {};
^~~~~~~
template_hell.cpp:31:3: note: candidate expects 1 argument, 0 provided
template_hell.cpp:27:7: note: candidate: constexpr a_class::a_class(const a_class&)
class a_class
^~~~~~~
template_hell.cpp:27:7: note: candidate expects 1 argument, 0 provided
template_hell.cpp:27:7: note: candidate: constexpr a_class::a_class(a_class&&)
template_hell.cpp:27:7: note: candidate expects 1 argument, 0 provided
如何通过模板实例传递参数以a_class?这不可能吗?
您正在将a_class
作为模板参数传递给my_template
模板类,并且由于类内部my_template
Stored_Data_Type m_data;
是以下struct
的对象
struct Stored_Data_Type {
a_class data;
int set_count = 0;
};
m_data
成员默认构造使用
my_template() : m_data() {}
它尝试调用a_class
尚未定义的默认构造函数。
因此,您只需要为a_class
类定义默认构造函数:
class a_class {
public:
a_class()
: m_data{0}
{}
// ...
};
查看实时示例
你可以使用可变参数。请参阅 https://en.cppreference.com/w/cpp/language/parameter_pack。这允许我们将传递给my_template
类的任何参数转发到StoredDataType
可变参数模板允许我们编写类/方法,这些类/方法以类型安全的方式接受任意数量的参数,并在编译时而不是运行时解析所有参数处理逻辑
#include <iostream>
template <typename T>
class my_template
{
public:
struct Stored_Data_Type
{
template<typename... TArgs>
Stored_Data_Type(TArgs&&... args) : data(std::forward<TArgs>(args)...)
{
}
T data;
int set_count = 0;
};
template<typename... TArgs>
my_template(TArgs&&... args) : m_data(std::forward<TArgs>(args)...) {}
T& write()
{
m_data.set_count++;
return m_data.data;
}
const T& get() const {return m_data.data;}
private:
Stored_Data_Type m_data;
};
class a_class
{
public:
a_class(int init): m_data(init) {};
void set(const int data) {m_data = data;};
const int get() const {return m_data;};
private:
int m_data;
};
class b_class : public a_class
{
public:
b_class(): a_class{0} {};
};
int main()
{
//a_class b(1);
b_class b;
b.set(2);
std::cout << "b: " << b.get() << std::endl;
my_template<int> my_int;
my_int.write() = 10;
std::cout << "my_int: " << my_int.get() << std::endl;
my_template<b_class> my_b;
my_b.write().set(2);
std::cout << "my_b: " << my_b.get().get() << std::endl;
// Compile error here:
my_template<a_class> my_a(1);
std::cout << "my_a: " << my_a.get().get() << std::endl;
}
相关文章:
- Arduino C++在构造函数中用参数声明对象数组
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- C++17 使用驱动类常量作为基类构造函数的参数来初始化基类构造函数
- 函数类型参数的模板参数推导
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- 运算符 new 的执行顺序和构造函数的参数
- 从析构函数访问模板类构造函数的参数,可以吗?
- 仅当构造函数具有参数时,C++ 公共成员才能访问
- 构造函数模板参数推导,其中 std::function 作为参数
- 是否接受将构造函数的参数作为类的实例传递?
- 如何构造一个 std::variant 类型对象,其自身 Templated 和构造函数转发参数
- 当构造函数的参数类型错误时引发异常
- 作为传递给 CPP 类构造函数的参数的用户定义函数
- 转换构造函数的参数可以隐式转换吗?
- C++ 模板可变参数类构造函数使用参数包,但函数不
- 创建多个对象并通过构造函数传递参数
- 如何正确访问通过引用从标准输入传递给构造函数的参数的值
- 是否有必要调用父构造函数而不使用子类构造函数的参数?
- 从函数指针对标准 C++98 中的函数类型参数进行静态推理
- 为什么初始化构造函数列表参数时会发生异常?