当前位置:  开发笔记 > 编程语言 > 正文

防止隐式模板实例化

如何解决《防止隐式模板实例化》经验,为你挑选了1个好方法。

在像这样的方法过载情况:

struct A
{
  void foo( int i ) { /*...*/ }
  template void foo( T t ) { /*...*/ }
}

除非明确命令,否则如何防止模板实例化?:

A a;
a.foo( 1 ); // ok
a.foo( 1.0 ); // ok
a.foo( 1 ); // calls non-templated method
a.foo( 1.0 ); // error

谢谢!



1> Vittorio Rom..:

您可以引入一个depedent_type防止模板参数推断的结构.

template 
struct dependent_type
{
    using type = T;
};

struct A
{
  void foo( int i ) { /*...*/ };
  template void foo( typename dependent_type::type t ) { /*...*/ }
}

在你的例子中:

a.foo( 1 );      // calls the template
a.foo( 1.0 ); // calls the template
a.foo( 1 );           // calls non-templated method
a.foo( 1.0 );         // calls non-templated method (implicit conversion)

wandbox示例

(此行为在cppreference > 模板参数推导 > 非推导的上下文中进行了解释.)


如果要a.foo( 1.0 )编译错误,则需要约束第一个重载:

template  
auto foo( T ) -> std::enable_if_t{}> { }

这种技术使得上面的重载foo仅采用int参数:不允许隐式转换(例如floatto int).如果这不是您想要的,请考虑TemplateRex的答案.

wandbox示例

(使用上面的约束函数,a.foo( 1 )调用时两个重载之间存在一种奇怪的交互.我问了一个关于它的问题,因为我不确定引导它的基本规则.)

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有