是否可以编写一个 C++ 模板函数,其模板参数当且仅当它是模板时才起作用?

问题描述 投票:0回答:1

我正在尝试编写一个小模板函数,该函数为传递给它的模板返回连续的整数 ID。以下内容适用于许多模板,但不适用于采用非类型参数的模板(如 std::array)。有什么办法可以让这项工作更普遍吗?如果没有,我最好的选择是什么? (我很想相信调用者只传递模板模板参数,并强制它们包含某种毫无意义的默认模板参数,因此它是普通类型 T:

ttypeid<vector<void>>()
ttypeid<array<void, 0>>()
等)

#include <atomic>
#include <vector>
#include <map>
#include <array>
#include <iostream>

using namespace std;

inline unsigned gen_id() {
    static atomic<unsigned> id = 0;
    return ++id;
}

template <template<typename ...> typename T>
inline unsigned ttypeid() {
    static unsigned id = gen_id();h
    return id;
}

int main() {
    cout << ttypeid<vector>() << endl;
    cout << ttypeid<map>()    << endl;

    // cout << ttypeid<array>()  << endl;
    //
    // error: no matching function for call to
    //     ‘ttypeid<template<class _Tp, long unsigned int _Nm> struct std::array>()’

    return 0;
}
c++ templates template-templates
1个回答
0
投票

不幸的是,类型和非类型模板(可变参数)参数不能很好地混合。

对于

std::array
,您可以添加以下内容:

template <template<typename T, auto,typename...> typename T>
inline unsigned ttypeid() {
    static unsigned id = gen_id();
    return id;
}

现场演示

但是,如果您想处理另一个模板,那么您需要编写另一个重载。好处是非类型模板参数并不丰富。在您自己的模板中,您可以通过将它们包装在类型中而不是使用裸值来避免它们。

    

© www.soinside.com 2019 - 2024. All rights reserved.