如果我有一个简单的函数,期望类型如下:
class X
{
public:
X( int ){}
};
void fx( X ) {}
fx( 1 ); // implicit converted to X(int); // fine!
如果我对模板化类型尝试相同的方法,它将无法正常工作。
template <typename T>
class Y
{
Y( T ){};
};
template <typename T>
void fy( Y<T> );
fy( 2 ); // Y<int> expected, but it fails
是否有任何强制转换的技巧?
需要隐式地进行操作,直接访问fy是 not 所需要的。我知道我可以通过指定模板参数来强制所有模板;)
答案 0 :(得分:3)
在template argument deduction中将不考虑隐式转换;无法推导模板参数T
。
类型推导不考虑隐式转换(上面列出的类型调整除外):这是超载解析的工作,稍后会发生。
您可以编写一个辅助函数模板。
template <typename T>
void helper(T&& t) {
fy<std::decay_t<T>>(std::forward<T>(t)); // specify the template argument explicitly
}
然后
helper(2); // T will be deduced as int
答案 1 :(得分:1)
模板参数推导不考虑任何隐式转换。
您可以手动指定所需的实例化:
RUN docker-php-ext-install calendar && docker-php-ext-configure calendar
在C ++ 17中使用模板类型推导,您也可以使用
fy<int>(2);
以及C ++ 17之前的版本
fy(Y(2));
答案 2 :(得分:1)
参数中不能包含隐式转换和模板推导。分解的另一种方法:
where
当然,根据template <typename T>
void fy( T x ) {
Y<T> y = x;
//Use y
return;
}
,您可能可以直接将fy
用作x
,并在函数中进行隐式转换。