模板函数参数显式类型声明
template function argument explicit type declaration
我有一个运算符重载列表,但我发现它们没有按我希望的方式运行。我将有问题的代码减少到几行来模拟问题。我有几个模板类型别名来帮助编译时决策,一个模板函数(工作代码中的一个运算符,但这里只是一个通用函数),以及一个名为 var
的 class 接受两个模板参数,一个 unsigned int
和一个 bool
(true
= known var,false
= unknown var,只是提到这一点,以便以下代码片段中的命名约定有意义).这是代码。
template<typename T>
using is_known = typename std::is_same<T, const var<T::ID, true> >::type;
template<typename T>
using is_unknown = typename std::conditional<is_known<T>::value, std::false_type, std::true_type>::type;
template<typename T>
using UK_if_UK = typename std::enable_if<is_unknown<T>::value, T>::type;
template<typename unknown_check_LHS, typename unknown_check_RHS>
constexpr const two_param_type<UK_if_UK<unknown_check_LHS>, UK_if_UK<unknown_check_RHS> > func(const unknown_check_LHS& lhs, const unknown_check_RHS& rhs)
{
return two_param_type<unknown_check_LHS, unknown_check_RHS>
(//generic construction goes here, unimportant...);
}
int main()
{
constexpr const var<0u,true> firstvar(123);
constexpr const var<1u,true> secondvar(456);
func(firstvar,secondvar);
func<std::decltype(firstvar),std::decltype(secondvar)>(firstvar,secondvar);
}
对 func()
的两次调用对我来说似乎是相同的,它们应该都失败(在工作代码中,一旦此函数 SFINAE 出现,还有其他选项)。但是,只有在我显式声明类型的第二次调用中,编译器才会抛出错误。它完美地编译了对 func()
的第一次调用,更糟糕的是,它运行 return 类型 "known" (var<(some unsigned),true>
),即使 [= 中的类型别名33=] 类型应该 SFINAE 超出重载决议的功能。我正在使用运算符,因此明确声明类型对我来说不是一个选项。然而,更重要的是,我想知道为什么函数没有 SFINAEing 出来。任何帮助,将不胜感激。谢谢。
注:具体错误为:
error: no matching function for call to 'func(const var<0u, true>&, const var<1u, true>&)'
此外,我已经测试了 is_known
、is_unknown
和 UK_if_UK
可以正常工作,因此无需测试它们。谢谢。
The two calls to func seem identical to me
错了。
它们是不同的。
这是一个常量问题。
有
constexpr const var<0u,true> firstvar(123);
constexpr const var<1u,true> secondvar(456);
和func()
的签名如下
template<typename unknown_check_LHS, typename unknown_check_RHS>
constexpr /* ... */ func (const unknown_check_LHS & lhs,
const unknown_check_RHS & rhs)
打电话
func(firstvar,secondvar);
类型 unknown_check_LHS
和 unknown_check_RHS
分别被检测为 var<0u, true>
和 var<1u, true>
。
请注意:var<0u, true>
和 var<1u, true>
,而不是 const var<0u, true>
和 const var<1u, true>
。
反之,说明类型如下
func<decltype(firstvar), decltype(secondvar)>(firstvar,secondvar);
(请:decltype()
,而不是std::decltype()
),unknown_check_LHS
和unknown_check_RHS
分别解释为const var<0u, true>
和const var<1u, true>
。
观察到现在类型是常量。
观察如何定义is_know
template<typename T>
using is_known = typename std::is_same<T, const var<T::ID, true> >::type;
它将类型 T
与常量类型进行比较。
因此,在第一种情况下(模板类型不是常量),is_known
为假;在第二种情况下(使用常量模板类型),这是真的。
我有一个运算符重载列表,但我发现它们没有按我希望的方式运行。我将有问题的代码减少到几行来模拟问题。我有几个模板类型别名来帮助编译时决策,一个模板函数(工作代码中的一个运算符,但这里只是一个通用函数),以及一个名为 var
的 class 接受两个模板参数,一个 unsigned int
和一个 bool
(true
= known var,false
= unknown var,只是提到这一点,以便以下代码片段中的命名约定有意义).这是代码。
template<typename T>
using is_known = typename std::is_same<T, const var<T::ID, true> >::type;
template<typename T>
using is_unknown = typename std::conditional<is_known<T>::value, std::false_type, std::true_type>::type;
template<typename T>
using UK_if_UK = typename std::enable_if<is_unknown<T>::value, T>::type;
template<typename unknown_check_LHS, typename unknown_check_RHS>
constexpr const two_param_type<UK_if_UK<unknown_check_LHS>, UK_if_UK<unknown_check_RHS> > func(const unknown_check_LHS& lhs, const unknown_check_RHS& rhs)
{
return two_param_type<unknown_check_LHS, unknown_check_RHS>
(//generic construction goes here, unimportant...);
}
int main()
{
constexpr const var<0u,true> firstvar(123);
constexpr const var<1u,true> secondvar(456);
func(firstvar,secondvar);
func<std::decltype(firstvar),std::decltype(secondvar)>(firstvar,secondvar);
}
对 func()
的两次调用对我来说似乎是相同的,它们应该都失败(在工作代码中,一旦此函数 SFINAE 出现,还有其他选项)。但是,只有在我显式声明类型的第二次调用中,编译器才会抛出错误。它完美地编译了对 func()
的第一次调用,更糟糕的是,它运行 return 类型 "known" (var<(some unsigned),true>
),即使 [= 中的类型别名33=] 类型应该 SFINAE 超出重载决议的功能。我正在使用运算符,因此明确声明类型对我来说不是一个选项。然而,更重要的是,我想知道为什么函数没有 SFINAEing 出来。任何帮助,将不胜感激。谢谢。
注:具体错误为:
error: no matching function for call to 'func(const var<0u, true>&, const var<1u, true>&)'
此外,我已经测试了 is_known
、is_unknown
和 UK_if_UK
可以正常工作,因此无需测试它们。谢谢。
The two calls to func seem identical to me
错了。
它们是不同的。
这是一个常量问题。
有
constexpr const var<0u,true> firstvar(123);
constexpr const var<1u,true> secondvar(456);
和func()
的签名如下
template<typename unknown_check_LHS, typename unknown_check_RHS>
constexpr /* ... */ func (const unknown_check_LHS & lhs,
const unknown_check_RHS & rhs)
打电话
func(firstvar,secondvar);
类型 unknown_check_LHS
和 unknown_check_RHS
分别被检测为 var<0u, true>
和 var<1u, true>
。
请注意:var<0u, true>
和 var<1u, true>
,而不是 const var<0u, true>
和 const var<1u, true>
。
反之,说明类型如下
func<decltype(firstvar), decltype(secondvar)>(firstvar,secondvar);
(请:decltype()
,而不是std::decltype()
),unknown_check_LHS
和unknown_check_RHS
分别解释为const var<0u, true>
和const var<1u, true>
。
观察到现在类型是常量。
观察如何定义is_know
template<typename T>
using is_known = typename std::is_same<T, const var<T::ID, true> >::type;
它将类型 T
与常量类型进行比较。
因此,在第一种情况下(模板类型不是常量),is_known
为假;在第二种情况下(使用常量模板类型),这是真的。