gpt4 book ai didi

c++ - 具有重载名称的模板化方法

转载 作者:行者123 更新时间:2023-11-28 08:26:42 25 4
gpt4 key购买 nike

为了与库中的其他类保持一致,我下面的数组类有两个 read() 方法。第一个将整个数组读取到输出迭代器并返回错误代码,第二个读取单个值并返回该值(使用错误异常)。

我遇到的问题是,如果我用 int 调用第二个 read(size_t idx) 方法,编译器更喜欢模板化方法。我需要明确指定一个 unsigned int 才能使其工作。我的问题是,围绕这个问题我有哪些选择:

  • 重命名任一读取函数以避免重载
  • 使用类似 boost::enable_if 的东西来防止迭代器版本与非迭代器一起工作。这虽然玷污了界面......
  • 还有什么我遗漏的想法吗?

-------------------------------------------- --------------

#include <iostream>
#include <iterator>
#include <vector>

struct FooArray
{
template <typename TIter>
int read( TIter out )
{
*out++ = 123.456; // copy stuff to output iterator
return 99; // error code
}

double read( size_t index )
{
return 1.234; // return value at index
}
};

int main(int argc, char**argv)
{
FooArray tmp;
std::cout << tmp.read(10u) << std::endl;
/* std::cout << tmp.read(10) << std::endl; COMPILER ERROR */
tmp.read( std::ostream_iterator<double>(std::cout,"\n") );
}

最佳答案

此外,我不认为 size_t 一定是 unsigned 的同义词,因此即使带有“u”后缀,代码也可能不可移植。

std::string 也有类似的问题,它要区分:

string s(10, 97);  //size_t, char
string t(s.begin(), s.end()); //iter

这会在内部将调用转发给合适的辅助函数(如果参数是整数,则需要在某处进行编译时测试)。

但是,在您的情况下,返回类型也不同,因此您必须首先选择正确的重载。

使用 enable_if 看起来不会那么糟糕:

#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_integral.hpp>

struct FooArray
{
template <typename TIter>
typename boost::disable_if<boost::is_integral<TIter>, int>::type
read( TIter out )
{
*out++ = 123.456; // copy stuff to output iterator
return 99; // error code
}

double read( size_t index )
{
return 1.234; // return value at index
}
};

关于c++ - 具有重载名称的模板化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3823049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com