我正在寻找一种方法来自动使默认模板参数在每次实例化模板时都是唯一的.由于lambda表达式创建的未命名函数对象具有不同的类型,我想以某种方式采用它们.随着标准愚蠢删除的最近更改"一个lambda表达式不会出现在......模板参数中"限制(参见未评估上下文中的lambdas的措辞),这似乎是一个好主意.所以我编写了以下有点编写最近gcc和clang的工作片段:
#include <type_traits>
template<void ( * ) (void) = [](){}> class
unique final {};
static_assert(false == ::std::is_same_v<unique<>, unique<>>);
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是一种可行的方法还是其中一种"形成不良,无需诊断"的案例?
一些额外的上下文:我想使用它来实现Ada样式的强类型定义,这些定义应该在单个翻译单元中工作,而无需手动发明未使用的唯一标记:
struct _tag_WowInt {};
using Int = type<int, _tag_WowInt>;
struct _tag_SoUnique {};
using DifferentInt = type<int, _tag_SoUnique>;
Run Code Online (Sandbox Code Playgroud)
Upd1:我想提一下,涉及__COUNTER__或类似宏的方法在一般情况下不起作用,因为它们只会被预处理器扩展一次,并且在模板内部使用时不会产生唯一类型.