使用 SFINAE 的 C++ 朋友模板
C++ friend template that use SFINAE
其实这道题很简单。我有一个带有一个参数的模板 class。
在另一个对象中,我将它设为它的友元,如下所示:
template< typename type_t >
class A
{
...
}
template< typename type_t >
class B
{
template< typename >
friend class A; // Works fine !
...
}
在那之后,我想添加一个条件来在实例化 class A(顺便说一下 B)时丢弃整数,方法是:
template< typename type_t, std::enable_if_t< std::is_floating_point_v< type_t >, bool > = false >
class A
{
...
}
template< typename type_t, std::enable_if_t< std::is_floating_point_v< type_t >, bool > = false >
class B
{
template< typename >
friend class A; // ============> Error!
...
}
通过阅读编译器消息,我了解到模板现在有两个参数。但是,当我与 class 交友时,我应该在第二个参数中输入什么?我尝试了 template, template 和 template...都编译失败。
这里的解决方案是什么?
正如 StoryTeller 在评论中所说,class B
或 A
中的 static_assert
可能是一个更简单的解决方案。它不会使用第二个模板参数并将启用熟悉的朋友声明。
但是,如果您仍然想通过 SFINAE 方式,您可以使用其中的完整 SFINAE 表达式声明您的朋友:
template<typename type_t, std::enable_if_t<std::is_floating_point_v<type_t>, bool> = false>
class B
{
template<typename T, std::enable_if_t<std::is_floating_point_v<T>, bool>>
friend class A;
};
其实这道题很简单。我有一个带有一个参数的模板 class。 在另一个对象中,我将它设为它的友元,如下所示:
template< typename type_t >
class A
{
...
}
template< typename type_t >
class B
{
template< typename >
friend class A; // Works fine !
...
}
在那之后,我想添加一个条件来在实例化 class A(顺便说一下 B)时丢弃整数,方法是:
template< typename type_t, std::enable_if_t< std::is_floating_point_v< type_t >, bool > = false >
class A
{
...
}
template< typename type_t, std::enable_if_t< std::is_floating_point_v< type_t >, bool > = false >
class B
{
template< typename >
friend class A; // ============> Error!
...
}
通过阅读编译器消息,我了解到模板现在有两个参数。但是,当我与 class 交友时,我应该在第二个参数中输入什么?我尝试了 template
这里的解决方案是什么?
正如 StoryTeller 在评论中所说,class B
或 A
中的 static_assert
可能是一个更简单的解决方案。它不会使用第二个模板参数并将启用熟悉的朋友声明。
但是,如果您仍然想通过 SFINAE 方式,您可以使用其中的完整 SFINAE 表达式声明您的朋友:
template<typename type_t, std::enable_if_t<std::is_floating_point_v<type_t>, bool> = false>
class B
{
template<typename T, std::enable_if_t<std::is_floating_point_v<T>, bool>>
friend class A;
};