使用 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 BA 中的 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;
};