具有模板化函数参数的隐式类型转换

时间:2018-07-31 09:03:20

标签: c++ templates c++17 implicit-conversion

如果我有一个简单的函数,期望类型如下:

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 所需要的。我知道我可以通过指定模板参数来强制所有模板;)

3 个答案:

答案 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,并在函数中进行隐式转换。