带外部链接的便携式名称"typeof"
Portable "typeof" of name with external linkage
Dr.Dobb的文章 便携式"类型"操作员说
但是,不能像使用函数模板或重载那样使用类模板从表达式中提取类型。(如果表达式是具有外部链接的名称,则可以使用模板非类型参数实现类模板的typeof,但这不是很有用。
括号中的粗体句子是否正确?如果是这样,如何使用模板非类型参数来查找具有外部链接的表达式的类型?
在 C++03 中没有办法在不使用 sizeof
的情况下实现typeof
。最接近的有用替代方法是使用返回所需类型的函数模板提取类型。
template<typename T>
struct Type
{
};
template<typename T>
Type<T> makeType(T)
{
return Type<T>();
}
int main()
{
int i;
makeType(2 + 2); // Type<int>
makeType(&i); // Type<int*>
}
以下技术使用 C++03 中的函数模板提取可在模板参数中使用的任何表达式的类型和值。
template<typename T, T value>
struct NonType
{
};
template<typename T>
struct Type
{
template<T value>
static NonType<T, value>
makeNonType()
{
return NonType<T, value>();
}
};
template<typename T>
Type<T> makeType(T)
{
return Type<T>();
}
#define MAKE_NONTYPE(e) makeType(e).makeNonType<e>()
int i;
int main()
{
MAKE_NONTYPE(2 + 2); // NonType<int, 4>
MAKE_NONTYPE(&i); // NonType<int*, i>
}
以下答案显示了此技术的实际用法,以提取指向成员函数表达式的指针的类型和值:如何允许模板化函子在成员和非成员函数上工作
它在
C++03 中不起作用 - 这种方法实际上是荒谬的,我认为作者并没有完全考虑过这个想法。
但是,使用隐式模板参数(如 C++1Z 建议的那样),这实际上可以工作:
template <using typename T, T&> struct infer {using type = T;};
int a;
infer<a>::type // int
不过,这仍然无法检测到a
是否是参考。
相关文章:
- 这是便携式的吗?
- i+=(i&-i) 有什么作用?它是便携式的吗?
- 以C++读取文件并处理可能的错误的便携式方法
- 如何检查文件是否复制成功?(便携式解决方案)C++
- GCC 7,-隐式故障警告,以及清除它们的便携式方法
- 便携式事件检查器,带条件和无锁通知
- 便携式C++单例 - 何时调用析构函数
- 带有柔性阵列构件的包装结构的便携式替代方案
- 用cmakelist.txt在clion上以一种不错的便携式方式配置sdl2
- 有没有一种便携式方法可以在 C/C++ 中生成 nop 操作码?
- 便携式检测__VA_OPT__支持?
- 哪种整数类型可以安全且便携式用于始终保持指针值
- 使用GlclearBufferdata用于复合数据类型的便携式
- 使用OpenACC生成便携式随机数
- 便携式标记指针
- Rocksdb的便携式二进制
- 故障化谷物便携式结构
- 获取媒体便携式设备的目录更改通知
- "永远"阻止线程的最简单便携式方法是什么?
- 带外部链接的便携式名称"typeof"