如何根据容器的元素类型启用模板函数实例化
How to enable template function instantiation depending on container's element type
我已经定义了容器检查结构及其实例:
template <typename Container>
struct is_container : std::false_type { };
template<typename... Ts>
struct is_container<std::vector<Ts...>> : std::true_type { };
template<typename... Ts>
struct is_container<std::deque<Ts...>> : std::true_type { };
//... all other STL containers
它非常有效,对于像这样的函数模板:
template<typename T, typename = typename std::enable_if<is_container<T>::value>::type>
void container_fun(const T& cont)
{
std::cout << "argument is clearly a container!" << std::endl;
}
但是现在,我想允许根据容器的元素类型进行实例化。好吧,类似的东西:
template<template<typename ...> class C , // container
typename T, // container's element
typename = typename std::enable_if<is_container<T>::value>::type> // permission
void is_element_container(const C<T>& cont)
{
std::cout << "container's elemement is also a container!" << std::endl;
}
但是,这会导致错误:
.../main.cpp:10: error: no matching function for call to 'is_element_container(std::deque<int, std::allocator<int> >&)'
is_element_container(deq);
^
.../containers.h:36: error: no type named 'type' in 'struct std::enable_if<false, void>'
typename = typename std::enable_if<is_container<T>::value>::type>
^
然而,删除第三个模板参数(权限检查)后:
template<template<typename ...> class C , // container
typename T> // container's element
程序编译正常,函数打印输出。为什么?
根据您的代码,is_element_container
要求 C
是一个以容器作为模板参数的容器。
但是编译器抱怨说 std::deque<int>
不是容器的容器,实际上不是。
就像你想做的那样
std::deque<int> cont;
is_element_container(cont);
但你似乎很想做
std::deque<std::deque<int>> cont;
is_element_container(cont);
这将使模板推导正常工作。
我已经定义了容器检查结构及其实例:
template <typename Container>
struct is_container : std::false_type { };
template<typename... Ts>
struct is_container<std::vector<Ts...>> : std::true_type { };
template<typename... Ts>
struct is_container<std::deque<Ts...>> : std::true_type { };
//... all other STL containers
它非常有效,对于像这样的函数模板:
template<typename T, typename = typename std::enable_if<is_container<T>::value>::type>
void container_fun(const T& cont)
{
std::cout << "argument is clearly a container!" << std::endl;
}
但是现在,我想允许根据容器的元素类型进行实例化。好吧,类似的东西:
template<template<typename ...> class C , // container
typename T, // container's element
typename = typename std::enable_if<is_container<T>::value>::type> // permission
void is_element_container(const C<T>& cont)
{
std::cout << "container's elemement is also a container!" << std::endl;
}
但是,这会导致错误:
.../main.cpp:10: error: no matching function for call to 'is_element_container(std::deque<int, std::allocator<int> >&)'
is_element_container(deq);
^
.../containers.h:36: error: no type named 'type' in 'struct std::enable_if<false, void>'
typename = typename std::enable_if<is_container<T>::value>::type>
^
然而,删除第三个模板参数(权限检查)后:
template<template<typename ...> class C , // container
typename T> // container's element
程序编译正常,函数打印输出。为什么?
根据您的代码,is_element_container
要求 C
是一个以容器作为模板参数的容器。
但是编译器抱怨说 std::deque<int>
不是容器的容器,实际上不是。
就像你想做的那样
std::deque<int> cont;
is_element_container(cont);
但你似乎很想做
std::deque<std::deque<int>> cont;
is_element_container(cont);
这将使模板推导正常工作。