基本上我想做的事情如下。假设我们有一个模板成员函数foo:
template <typename T>
T SomeClass::foo();
并且用户以某种方式将 map< string, int > 作为模板参数传递:
foo<map<string, int>>();
我想在这里做的是,在定义函数foo 时,获取内部类型string 和int。我尝试了很多猜测来取消对论点的专门化,但无济于事。
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/