如果您的数据由 表示,则T
您根本无法让模板化代码定期运行,因为这不是容器。正如@Mark Ransom 所指出的,您可以改用,例如通过这样的特征bool
std::vector<bool>
std::vector<char>
template<typename T> struct vector_trait { typedef std::vector<T> type; };
template<> struct vector_trait<bool> { typedef std::vector<char> type; };
然后typename vector_trait<T>::type
在您当前使用的任何地方使用std::vector<T>
. 这里的缺点是您需要使用强制转换从 转换char
为bool
。
您自己的答案中建议的另一种方法是编写具有隐式转换和构造函数的包装器
template<typename T>
class wrapper
{
public:
wrapper() : value_(T()) {}
/* explicit */ wrapper(T const& t): value_(t) {}
/* explicit */ operator T() { return value_; }
private:
T value_;
};
并std::vector< wrapper<bool> >
在任何地方使用而无需投射。但是,这也有缺点,因为包含实bool
参数的标准转换序列的行为与用户定义的转换不同wrapper<bool>
(编译器最多可以使用 1 个用户定义的转换,并且可以根据需要使用尽可能多的标准转换)。这意味着具有函数重载的模板代码可能会被巧妙地破坏。您可以取消注释explicit
上面代码中的关键字,但这会再次引入冗长。