c++ - 推断基类的函数模板参数
问题描述
在这个例子中,我只需要为基类类型实例化模板函数。
struct A{ int i=0; };
struct A1:A{};
struct A2:A{};
struct B{ int i=1; };
struct B1:B{};
struct B2:B{};
template<typename T> uint32_t Checksum ( const T& t )
{
// make sure we are not instantiating redundant functions
static_assert(std::is_same<T,A>::value || std::is_same<T,B>::value,"");
return t.i;
}
template uint32_t Checksum ( const A& t ); //this are actually no ops
template uint32_t Checksum ( const B& t ); //this are actually no ops
int main()
{
A1 a1;
A2 a2;
B1 b1;
B2 b2;
Checksum<A>(a1);//ok
Checksum<A>(a2);//ok
Checksum<B>(b1);//ok
Checksum<B>(b2);//ok
Checksum(b2); //error
return 0;
}
是否可以强制模板类型推导到基类,理想情况下没有 C++17 推导指南,这样我就不必在调用时指定类型?
我还尝试显式实例化这些函数,想知道它们最终是否会在函数重载解析中发挥作用,但编译器没有选择它们。也许这有一些技巧。
解决方案
怎么样:
foo.h
struct A{ int i=0; };
struct A1:A{};
struct A2:A{};
struct B{ int i=1; };
struct B1:B{};
struct B2:B{};
uint32_t Checksum ( const A& t );
uint32_t Checksum ( const B& t );
校验和.cpp
#include "foo.h"
template<typename T> uint32_t ChecksumImpl ( const T& t )
{
// make sure we are not instantiating redundant functions
static_assert(std::is_same<T,A>::value || std::is_same<T,B>::value,"");
return t.i;
}
uint32_t Checksum ( const A& t ) { return ChecksumImpl (t);}
uint32_t Checksum ( const B& t ) { return ChecksumImpl (t);}
主文件
#include "foo.h"
int main()
{
A1 a1;
A2 a2;
B1 b1;
B2 b2;
Checksum(a1);//ok
Checksum(a2);//ok
Checksum(b1);//ok
Checksum(b2);//ok
}
推荐阅读
- pine-script - 无法添加警报功能
- python - 尝试在 IF 条件下在 python 中创建新列时出现值错误
- c++ - 在类方法中操作向量
- java - org.apache.maven.plugins.enforcer.BanDuplicateClasses 失败并显示消息:找到重复的类
- json - 如何将以下值转换为 json(字符串到 JSON 数组)
- android - Android 警报管理器插件不会触发
- assembly - 如何使用汇编语言,使用 looz 指令在累加器体系结构中查找具有 n 个元素的数组的总和
- android - cardview android上的clicklistener
- rest - 有没有办法使用 REST API 提取所有受 Rally 风险影响的工作项?
- python-3.x - Tkinter Radiobutton:与图像一起删除点