我正在尝试创建一个新的模板化类"CrazyBucket <T>",它必须包含多个T类型的值.
我想为这个类创建一个构造函数,它可以接受任何2个前向迭代器作为参数,并将这些值(类型为T)复制到类实例中.
构造函数:
CrazyBucket< T >::CrazyBucket( iterator< forward_iterator_tag, T > start, iterator< forward_iterator_tag, T > end )
{ ... }
Run Code Online (Sandbox Code Playgroud)
但是当我试着用它来打电话时,
vector< int > vec;
vec.push_back( 4 );
CrazyBucket< int > bucket( vec.begin(), vec.end() );
Run Code Online (Sandbox Code Playgroud)
我收到以下错误,
candidate constructor not viable: no known conversion from 'iterator' (aka '__wrap_iter<pointer>') to 'std::iterator<std::forward_iterator_tag, int>' for 1st argument
我非常感谢任何有关如何定义构造函数的帮助.
提前致谢.
您可以使用 SFINAE 以我认为接近您想要的方式排除不匹配的类型。
#include <iostream>
#include <iterator>
#include <vector>
template<class T>
class CrazyBucket
{
public:
template<class It, typename = typename std::enable_if<
std::is_same< typename std::iterator_traits<It>::value_type,T>::value>::type>
CrazyBucket(It beg, It end)
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}
};
int main()
{
std::vector<int> vInt;
CrazyBucket<int> cbOK(vInt.begin(), vInt.end());
int ar[10];
CrazyBucket<int> cbAlsoOK(ar, ar+10);
// uncomment for failure test case.
//std::vector<double> vDbl;
//CrazyBucket<int> cbFail(vDbl.begin(), vDbl.end());
}
Run Code Online (Sandbox Code Playgroud)
也可以通过静态断言来完成:
template<class It>
CrazyBucket(It beg, It end)
{
static_assert(std::is_same<T, typename std::iterator_traits<It>::value_type>::value,
"failed to match iterator value type");
std::cout << __PRETTY_FUNCTION__ << '\n';
}
Run Code Online (Sandbox Code Playgroud)
两者都是限制性的,您应该知道这可能不是您想要的最终目标。例如,迭代short自然会存储为int不丢失数据,但这种SFINAE会扔掉它。这也可以通过更多的扩展来克服,但到那时我认为你需要考虑它最终是否真的值得。
无论如何,祝你好运。
| 归档时间: |
|
| 查看次数: |
677 次 |
| 最近记录: |