C++双重模板参数(template template parameter)源码释义

源码释义

namespace templateTemplateParameter
{
// 双重模板参数

#if !defined(__PRETTY_FUNCTION__) && !defined(__GNUC__)
#    define __PRETTY_FUNCTION__ __FUNCSIG__
#endif
template <typename T, template <class, class...> class C, class... Args>
std::ostream& operator<<(std::ostream& os, const C<T, Args...>& objs)
{
    // 可以将参数全部打印出来
    os << "FUNC DETAIL: " << __PRETTY_FUNCTION__ << '\n';
    for (auto const& obj : objs)
        os << obj << ' ';
    return os;
}
template <template <class> class H, class S>
S calcListTotalValue(const H<S>& ls)
{
    auto a = std::begin(ls);
    auto b = std::end(ls);
    S    totalValue{};
    for (auto i = a; i != b; ++i)
    {
        totalValue += *i;
    }
    return totalValue;
}
//template <template <class, class> class V, class T, class A>
template <template <typename, typename> class V, typename T, typename A>
T calcListTotalValue2(V<T, A>& ls)
{
    auto a = std::begin(ls);
    auto b = std::end(ls);
    T    totalValue{};
    for (auto i = a; i != b; ++i)
    {
        totalValue += *i;
    }
    return totalValue;
}
void testMain()
{
    std::cout << "\ntemplateTemplateParameter::testMain() begin.\n";

    std::list<int> list_01{10,3,5};
    auto value1 = calcListTotalValue<std::list, int>(list_01);
    value1 = calcListTotalValue<std::list>(list_01);
    std::cout << "value1: " << value1 << "\n";
    calcListTotalValue2<std::list, int>(list_01);
    auto value2 = calcListTotalValue2(list_01);
    std::cout << "value2: " << value2 << "\n";

    std::cout << "list_01: " << list_01 << "\n";
    std::cout << "templateTemplateParameter::testMain() end.\n";
}
} // namespace templateDefTest03

打印输出如下所示:

templateTemplateParameter::testMain() begin.
value1: 18
value2: 18
list_01: FUNC DETAIL: class std::basic_ostream<char,struct std::char_traits<char> > &__cdecl templateTemplateParameter::operator <<<int,class std::list,class std::allocator<int>>(class std::basic_ostream<char,struct std::char_traits<char> > &,const class std::list<int,class std::allocator<int> > &)
10 3 5
templateTemplateParameter::testMain() end.

通过上述宏信息输出,可以清楚的看到函数的具体形态。

MSVC中__FUNCSIG__宏

__FUNCSIG__:定义为包含封闭函数签名的字符串文本。 此宏仅在函数中定义。 如果使用 /EP 或 /P 编译器选项,则不会展开 __FUNCSIG__ 宏。 当针对 64 位目标进行编译时,调用约定默认为 __cdecl。 有关用法的示例,请参阅 __FUNCDNAME__ 宏。

细节请见: 预定义宏 | Microsoft Learn

关于__PRETTY_FUNCTION__宏

在linux系统中用g++编译C++程序, __FUNCTION__宏只输出类的成员函数名,不会输出类名。而__PRETTY_FUNCTION__宏则会以 <return-type>  <class-name>::<member-function-name>(<parameters-list>) 的格式输出成员函数的详悉信息(注:只会输出parameters-list的形参类型,而不会输出形参名)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值