gpt4 book ai didi

c++ - 调用较少约束的功能等效函数

转载 作者:行者123 更新时间:2023-12-01 14:52:59 26 4
gpt4 key购买 nike

考虑以下代码:

#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<T>(T*)调用常规 foo<HasParent T>(T*)函数?

(这是一个(功能)示例,但是我可以在github上链接完整的代码)

最佳答案

Is it possible to call the general foo<T>(T*) function from foo<HasParent T>(T*)?



您需要某种方式来区分这两个功能。

例如:
template <typename T>               void foo(T);
template <typename T> requires true auto foo(T) -> int;

对于所有 T来说,第二个显然比第一个更受约束,因此 foo(42)调用第二个。但是,您可以区分两者:
auto unconstrained = static_cast<void(*)(int)>(foo);

在这里,受约束的函数模板返回 int,因此它不是可行的候选者,而我们得到了不受约束的候选者。

在您的示例中,两个都返回 int,因此此特殊技巧不起作用。但是关键是您需要某种方式来区分这两个模板。

更好的方法可能是:
template <typename T, std::monostate M = {}>
void foo(T);

template <typename T> requires true
void foo(T arg) {
foo<T, std::monostate{}>(arg); // calls the unconstrained one
}

在这里使用 monostate有点可爱,因为它实际上并没有改变模板实例化的数量(只有一个 monostate ...)。 foo(42)调用第二个,后者调用第一个。 Demo

但是,最好只是添加一个新函数,然后让函数模板的不受约束和受约束的版本都调用该函数(从某种意义上说,它比 monostate方法具有更少的神秘性)。

关于c++ - 调用较少约束的功能等效函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61176476/

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