【发布时间】:2020-04-12 18:47:40
【问题描述】:
考虑以下代码:
#include <iostream>
#include <type_traits>
struct A;
template<class T>
concept HasParent = std::is_convertible_v<typename T::parent*, A*>;
struct A{};
struct B : A { using parent = A; };
template<class T> int foo(T*) { return 1; }
template<HasParent T> int foo(T*)
{
// call the other one?
return 2;
}
int main()
{
B b;
std::cout << foo(&b) << std::endl; // displays 2
return 0;
}
是否可以从foo<HasParent T>(T*)调用通用的foo<T>(T*)函数?
(这是一个(功能性)示例,但我可以在github上链接完整的代码)
【问题讨论】:
-
所以你想调用通用版本并将
T*传递给HasParent T版本? -
你能做的就是把
foo写成template<class T, bool F=false> int foo(T*) { return 1; },然后你可以写foo<T,false>(t),但我希望这不是解决这个问题的唯一方法。 -
@t.niese,这绝对不是唯一的方法,因为总是有相对干净的选择将公共部分分解为单独的函数。
-
@chris 确定这是一种解决从专业调用通用函数的要求的方法(并且可能是更好的方法),但它不会回答问题,如果/如何是有可能的。
-
@chris 除了公共部分是整个其他函数外,重载只是用户以递归方式与父级调用相同的方法,如果可用
标签: c++ overloading c++20 c++-concepts