gpt4 book ai didi

c++ - 防止隐式模板实例化

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:18:13 26 4
gpt4 key购买 nike

在这样的方法重载情况下:

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

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

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

谢谢!

最佳答案

你可以介绍一个depedent_type阻止 template argument deduction 的结构.

template <typename T>
struct dependent_type
{
using type = T;
};

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

在你的例子中:

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

wandbox example

(此行为在 cppreference > template argument deduction > non-deduced contexts 上有解释。)


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

template <typename T> 
auto foo( T ) -> std::enable_if_t<std::is_same<T, int>{}> { }

此技术使 foo 的上述重载只取int参数:隐式转换 (例如 floatint ) 是不允许的。如果这不是您想要的,请考虑 TemplateRex 的回答。

wandbox example

关于c++ - 防止隐式模板实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41634538/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com