作为method to check the existence of specific free functions的一部分,我有一个可以隐式转换为任何其他类型的类型:
struct AnyConvert
{
template <class Dest>
operator Dest & ();
template <class Dest>
operator Dest const & () const;
};
我在函数参数中使用AnyConvert
作为选项,我在检查函数是否存在时并不挑剔。请注意,此类型仅在编译时用于元编程。
除以下情况外,此方法效果很好:
template <class T> struct SomeType {};
template <class T>
int someFunction( SomeType<T> );
int someOtherFunction( SomeType<int> );
decltype( someOtherFunction( AnyConvert() ); // works
decltype( someFunction( AnyConvert() ); // does not work
我对AnyConvert应该转换为的类型没有任何先进的知识。我也无法修改它应该隐式转换为的类型。我尝试添加以下功能:
template <template <typename> class Dest, class ... T>
operator Dest<T...> & ();
到AnyConvert
,但这似乎也无法解决问题。生成的编译器错误往往类似于:
‘AnyConvert’ is not derived from ‘SomeType<T>’
所以我的问题是: 如何在未指定模板类型时创建将隐式转换为模板化类型的类型?可能会发现这是不可能的,在这种情况下,我需要提出一种更好的方法来检查函数参数的子集是否正确。