c++ - 非特化 C++ 模板参数

标签 c++ templates

基本上我想做的事情如下。假设我们有一个模板成员函数foo:

template <typename T>
T SomeClass::foo();

并且用户以某种方式将 ma​​p< string, int > 作为模板参数传递:

foo<map<string, int>>();

我想在这里做的是,在定义函数foo 时,获取内部类型stringint。我尝试了很多猜测来取消对论点的专门化,但无济于事。

template <map<typename K, typename V>>
map<K, V> SomeClass::foo();  // absolutely illegal

我考虑过使用偏特化,但它没有奏效,因为 foo 是一个类成员函数。

最佳答案

如果你想要一种从模板中获取内部类型的通用方法,你可以使用显式特化:

template <typename T>
struct unpack;

template <template <typename...> class C, typename A, typename B>
struct unpack<C<A, B>>
{
    using first  = A;
    using second = B;
};

用法:

static_assert(std::is_same_v<string,
    typename unpack<map<string, int>>::first
>);

static_assert(std::is_same_v<int,
    typename unpack<map<string, int>>::second
>);

如果您只关心在调用函数时这样做,您可以将函数设为模板:

template <typename K, typename V>
void foo(std::map<K, V>);

关于c++ - 非特化 C++ 模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51673275/

相关文章:

c++ - 是否保证初始化顺序

c++ - std::sort 使用函数作为比较器,不起作用?

C++ 数组 - 限制和大小

用于连接 std::vector 和 std::array 类型的 C++ 模板函数

c++ - 理解 C++ 类中的 std::bad_alloc

c++ - 如何按取消引用的值对集合进行排序?

c++ - 为什么接受没有关键字的依赖模板名称?

javascript - Nunjucks 预编译干净的 html

c++ - 模板类成员 VS 嵌套类前向声明

c++ - 部分排序期间成员函数模板的原始类型是什么