c++ - 函数模板重载谜题

标签 c++ c++11 template-meta-programming template-specialization overloading

我有一个类和一个类模板

class promise;

template <class... Ts>
class typed_promise;

我打算设计一个转换实用程序来在它们之间转换

template <class... Ts>
typed_promise<Ts...> promise_cast(promise x);

template <class... Ts>
promise promise_cast(typed_promise<Ts...> x);

所以,你可以做下面的转换

promise pms;
typed_promise<int, int> typed_pms;
auto typed_pms2 = promise_cast<int, int>(pms);
auto pms2 = promise_cast(typed_pms);

我也想支持这样的用法

auto typed_pms2 = promise_cast<typed_promise<int, int>>(pms);

相当于

auto typed_pms2 = promise_cast<int, int>(pms);

由于C++不允许部分函数模板特化,是否可以实现我想要的?如果可以,我应该怎么做?

最佳答案

当重载变得棘手时,您应该考虑完全不重载的替代方案。

给函数不同的名字,可能是 add_promise_typeerase_promise_type。那么就不需要“部分特化”。

template <class... Ts>
typed_promise<Ts...> add_promise_type(promise x);

template <class... Ts>
promise erase_promise_type(typed_promise<Ts...> x);

模拟类型转换通常很诱人,但它是XY problems 的雷区。 .您会更喜欢更简单的解决方案,它实际上更适合手头的任务。

关于c++ - 函数模板重载谜题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34938572/

相关文章:

c++ - Cocos2D-X选择合适 Sprite 表的最高效方式

C++ 模板 "is not a type"错误

c++ - 在 std::unordered_map 中分配 ID 后创建对象

c++ - 无法让 SFINAE 工作

c++ - 在 C++ 元编程中存储状态?

c++ - 头文件中的全局函数定义——如何避免重复符号链接(symbolic link)错误

c++ - 如何使用memset清除char数组

c++ - 通用 lambda 与标准模板函数(使用什么以及何时使用)

c++ - 从 priority_queue 弹出时出现排序问题,这是 std::priority_queue 的错误吗

c++ - 如何使用 `is_member_function_pointer` 包含/排除算法中的成员函数调用?