本文介绍了在编译时检查是模板类型还是向量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我可以想象以下代码:
template <typename T> class X
{
public:
T container;
void foo()
{
if(is_vector(T))
container.push_back(Z);
else
container.insert(Z);
}
}
// somewhere else...
X<std::vector<sth>> abc;
abc.foo();
如何编写,才能成功编译?我知道类型特征,但是在定义时:
How to write it, to successfully compile? I know type traits, but when I'm defining:
template<typename T> struct is_vector : public std::false_type {};
template<typename T, typename A>
struct is_vector<std::vector<T, A>> : public std::true_type {};
无法编译:
error: no matching function for call to 'std::vector<sth>::insert(Z)'
static_assert也不是我要找的东西.有什么建议吗?
static_assert also isn't that what I'm looking for. Any advices?
这是我要实现的目标(SSC E)的简短示例: http://ideone.com/D3vBph
Here's a short example of what I want to achieve (SSCE): http://ideone.com/D3vBph
推荐答案
它被称为标签分派:
#include <vector>
#include <set>
#include <type_traits>
template<typename T> struct is_vector : public std::false_type {};
template<typename T, typename A>
struct is_vector<std::vector<T, A>> : public std::true_type {};
template <typename T>
class X {
T container;
void foo( std::true_type ) {
container.push_back(0);
}
void foo( std::false_type ) {
container.insert(0);
}
public:
void foo() {
foo( is_vector<T>{} );
}
};
// somewhere else...
int main() {
X<std::vector<int>> abc;
abc.foo();
X<std::set<int>> def;
def.foo();
}
这篇关于在编译时检查是模板类型还是向量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!