将 class 模板推迟到其构造函数
Postpone class template to its constructor
恐怕我要找的是不可能的。它可能需要改变我的设计。我正在寻找将 class 模板推迟到其构造函数。这是示例:
以下代码可以正常工作:
#include <iostream>
using namespace std;
template<class T1,class T2>
T1 product(T1 t1,T2 t2)
{
return (T1)(t1*t2);
}
int main()
{
double t1=5.5;
int t2=4;
cout<<t1<<" x "<<t2<<" = "<<product(t1,t2)<<endl;
return 0;
}
现在,如果我想将函数 product
包装在 class 中:
#include <iostream>
using namespace std;
template<class T1,class T2>
class A
{
public:
T1 num1;
T2 num2;
template<class T1,class T2>
A(T1 t1,T2 t2)
{
num1=t1;
num2=t2;
}
T1 product()
{
return (T1)(num1*num2);
}
T1 division()
{
return (T1)(num1/num2);
}
};
int main()
{
double t1=5.5;
int t2=4;
// i need types here, this will not compile because
// i would need to explicitly state A<double, int> here.
class A a(t1,t2);
cout<<t1<<" x "<<t2<<" = "<<a.product(t1,t2)<<endl;
return 0;
}
此代码无法编译。显然是因为它正在寻找 <double,int>
作为 class 的模板。修复编译器错误很容易,与我无关。
我担心的是现在,我觉得我失去了优势!在之前的代码中,我可以调用函数而不用担心类型。我给了函数参数。现在我必须先给 class 参数类型。我不能从 t1 和 t2 的自动检测类型中定义 class。有没有办法将 class 模板推迟到其构造函数?
也许你认为给 class 模板赋予类型很容易,没有争论的价值!但是想象一个非常复杂的情况。
您创建了一个创建者函数 returns "the right thing(tm)":
template<typename T1, typename T2>
auto make_A(T1 n1, T2 n2)->A<T1, T2> {
return A<T1, T2>(n1, n2);
}
以后像这样使用它:
auto a = make_A(t1, t2);
就是这样。但请注意:auto
是一个漂亮的 "newish" 关键字,如果您 运行 使用旧的编译器,您可能 运行 会遇到麻烦。在重构你的大项目之前,你应该检查你必须支持的最低编译器。
更多信息:
- 斯科特·迈耶斯 "Type Deduction and Why You Care" https://www.youtube.com/watch?v=wQxj20X-tIU
- Mike Action "Data-Oriented Design and C++" https://www.youtube.com/watch?v=rX0ItVEVjHc ...这个演讲是为了质疑你对 "classes because of why not?!"
的需求
恐怕我要找的是不可能的。它可能需要改变我的设计。我正在寻找将 class 模板推迟到其构造函数。这是示例:
以下代码可以正常工作:
#include <iostream>
using namespace std;
template<class T1,class T2>
T1 product(T1 t1,T2 t2)
{
return (T1)(t1*t2);
}
int main()
{
double t1=5.5;
int t2=4;
cout<<t1<<" x "<<t2<<" = "<<product(t1,t2)<<endl;
return 0;
}
现在,如果我想将函数 product
包装在 class 中:
#include <iostream>
using namespace std;
template<class T1,class T2>
class A
{
public:
T1 num1;
T2 num2;
template<class T1,class T2>
A(T1 t1,T2 t2)
{
num1=t1;
num2=t2;
}
T1 product()
{
return (T1)(num1*num2);
}
T1 division()
{
return (T1)(num1/num2);
}
};
int main()
{
double t1=5.5;
int t2=4;
// i need types here, this will not compile because
// i would need to explicitly state A<double, int> here.
class A a(t1,t2);
cout<<t1<<" x "<<t2<<" = "<<a.product(t1,t2)<<endl;
return 0;
}
此代码无法编译。显然是因为它正在寻找 <double,int>
作为 class 的模板。修复编译器错误很容易,与我无关。
我担心的是现在,我觉得我失去了优势!在之前的代码中,我可以调用函数而不用担心类型。我给了函数参数。现在我必须先给 class 参数类型。我不能从 t1 和 t2 的自动检测类型中定义 class。有没有办法将 class 模板推迟到其构造函数?
也许你认为给 class 模板赋予类型很容易,没有争论的价值!但是想象一个非常复杂的情况。
您创建了一个创建者函数 returns "the right thing(tm)":
template<typename T1, typename T2>
auto make_A(T1 n1, T2 n2)->A<T1, T2> {
return A<T1, T2>(n1, n2);
}
以后像这样使用它:
auto a = make_A(t1, t2);
就是这样。但请注意:auto
是一个漂亮的 "newish" 关键字,如果您 运行 使用旧的编译器,您可能 运行 会遇到麻烦。在重构你的大项目之前,你应该检查你必须支持的最低编译器。
更多信息:
- 斯科特·迈耶斯 "Type Deduction and Why You Care" https://www.youtube.com/watch?v=wQxj20X-tIU
- Mike Action "Data-Oriented Design and C++" https://www.youtube.com/watch?v=rX0ItVEVjHc ...这个演讲是为了质疑你对 "classes because of why not?!" 的需求