【发布时间】:2013-03-06 16:45:18
【问题描述】:
下面是一个有缺陷的(和简化的)模板函数,它期望在模板 arg 上工作,该模板 arg 可以转换为预定义数量的类型之一。
刚好有2种,不过冷多了。
void do_something_type_specific( const int &unused ) { std::cout << 'i'; }
void do_something_type_specific( const std::string &unused ) { std::cout << 's'; }
template< typename Iterator >
void perform_work_on_a_range( Iterator begin, Iterator end )
{
do_something_type_specific( *begin );
// Perhaps more code...
}
这恰好在我的环境中产生了预期的结果。
如果 *Iterator 生成的类型可以完全转换为其中一个选项,则模板实例将成功编译。
但是,此代码不必要地要求执行转换,尽管unused 未被使用,但begin == end 时仍有UB。
如何在没有这些问题的情况下在 C++03 中实现这种行为?
【问题讨论】:
-
我认为这可能与 SFINAE 一起完成。
-
据我所知,C++03 只提供了一个“简单”的运行时,没有办法看到一个类型可以转换成什么。它是一种静态语言,除了一点运行时多态性。
-
@bash.d 类型可以转换为静态信息(请记住,C++ 是一种静态语言!)。我不明白为什么运行时会参与其中。
-
@bash.d:但是他把类型作为模板参数,所以他可以。
-
这是您要找的吗? liveworkspace.org/code/3A44Ws$7