gpt4 book ai didi

C++模板类,模板成员友元函数匹配规则

转载 作者:行者123 更新时间:2023-11-30 02:19:02 27 4
gpt4 key购买 nike

我有一个带有模板化友元函数声明的模板化类,当用更直接但看似等价的表达式声明时,它的签名没有匹配:

link to example on online compiler

#include <type_traits>

template <typename Sig> class Base;
template <typename R, typename ... Args> class Base<R(Args...)> { };
template <typename Sig, typename T> class Derived;
template <typename Sig> struct remove_membership;

template <typename T, typename R, typename ... Args>
class Derived<R(Args...), T> : public Base<R(Args...)> {
static void bar() { }

// XXX: why are these two not equivalent, and only the 1st version successful?
template <typename T2>
friend auto foo(T2 const &) -> Base<typename
remove_membership<decltype(&std::remove_reference_t<T2>::operator())>::type> *;
template <typename T2>
friend auto foo(T2 const &) -> Base<R(Args...)> *;
};

template <typename F, typename R, typename ... Args>
struct remove_membership<R (F::*)(Args...) const> {
using type = R(Args...);
};

template <typename T>
auto foo(T const &) -> Base<typename
remove_membership<decltype(&std::remove_reference_t<T>::operator())>::type> *
{
using base_param_t = typename remove_membership<
decltype(&std::remove_reference_t<T>::operator())>::type;
Derived<base_param_t, T>::bar();
return nullptr;
}

int main(int, char **) { foo([](){}); } // XXX blows up if verbose friend decl. removed.

Derived<R(Args...), T> 的内部成员定义(例如,在 bar() 的正文中),类型匹配,增加了我的困惑:

static_assert(std::is_same<Base<R(Args...)>, Base<typename  
remove_membership<decltype(&std::remove_reference_t<T>::operator())>::type>>::value,
"signature mismatch");

是否有关于模板类模板成员函数(和友元函数)声明和实例化的规则,使这些前面的声明在某些或所有情况下都不同?

最佳答案

template <typename T2>
void foo(T2 const &)

template <typename T2>
auto foo(T2 const &)
-> std::enable_if_t<some_traits<T2>::value>;

是 2 个不同的重载。即使两者都返回 void (有效时)。
第二次重载使用 SFINAE。

(是的,与常规函数相反,模板函数只能在返回类型上有所不同)。

您的版本不相同但相似(&std::remove_reference_t<T>::operator() 应该有效)

你可以使用更简单的模板友元函数:

template <typename T, typename R, typename ... Args>
class Derived<R(Args...), T> : public Base<R(Args...)> {
static void bar() { }

template <typename T2>
friend auto foo(T2 const &) -> Base<R(Args...)>*;
};

template <typename T>
auto foo(T const &) -> Base<void()>* // friend with Derived<void(), U>
{
using base_param_t = typename remove_membership<
decltype(&std::remove_reference_t<T>::operator())>::type;
Derived<base_param_t, T>::bar();
return nullptr;
}

Demo

但是你必须实现不同版本的模板foo .

关于C++模板类,模板成员友元函数匹配规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51295481/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com