【发布时间】:2020-11-21 06:09:47
【问题描述】:
首先,代码仅限于C++11,所以无法使用if constexpr
以下是我的示例代码 sn-p:
class A{
public:
int a;
int b;
}
class B{
public:
int key;
int val;
}
class C{
public:
int n1;
int n2;
}
class D{
public:
int n1;
int n2;
}
class E{
public:
int n1;
int n2;
}
template<typename T>
void func1(T data) {
if (T == type(A)) { // Just pseudo template-check code
std::cout<<data.a<<data.b; //<------1
} else if (T == type (B)) { // Just pseudo template-check code
std::cout<<data.key<<data.val; //<------2
} else {
std::cout<<data.n1<<data.n2; //<------3
}
int main() {
A a;
B b;
C c;
D d;
E e;
func1(a);
func1(b);
func1(c);
func1(d);
func1(e);
return 0;
}
目前,我收到一个编译时错误,
1: B,D,E,F has no member a & b
&
2: A,D,E,F has no member key & val
&
3. A, B has no member n1 & n2
我尝试使用is_same() 和this,但每次都会遇到相同的编译时错误。
- 我无法使用 C++14/C++17
- 如何使用专门的模板函数?
编辑代码以突出模板的需要。
【问题讨论】:
-
你想要完成的工作中有哪一部分是老式的、直截了当的、专业化的无法完成的?
-
一个相对现实的用法,包括
main将是巨大的,因为到目前为止,我认为除了提供两个不同的功能之外没有理由做任何事情。std::cout<<T.a<<T.b;纯属幻想;它不是远程有效的代码。func1没有参数,因此调用者完全负责在调用点提供A或B作为模板参数。如果您要这样做,您可能首先要调用两个不同的函数,无论是专业化还是其他。 -
更新后,现在问问自己,为什么完全模板化?为什么不直接使用
func1和两个重载:void func1(A data)和void func1(B data)? -
在您的示例中,您根本不需要模板。只需定义 func1 的 2 个重载。
-
您需要多少通用性?你得到的答案对
A和B很好。可以让它适用于任何类型,但值得吗?