Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无调用约束函数等价函数_C++_Overloading_C++20_C++ Concepts - Fatal编程技术网

C++ 无调用约束函数等价函数

C++ 无调用约束函数等价函数,c++,overloading,c++20,c++-concepts,C++,Overloading,C++20,C++ Concepts,考虑以下代码: #包括 #包括 结构A; 模板 概念HasParent=std::可转换吗; 结构A{}; 结构B:A{using parent=A;}; 模板int foo(T*){return 1;} 模板int foo(T*) { //给另一个打电话? 返回2; } int main() { B B; 标准::cout 是否可以从foo(T*)调用常规foo(T*)函数 为了做到这一点,您需要一些方法来区分这两个函数 例如: template <typename T>

考虑以下代码:

#包括
#包括
结构A;
模板
概念HasParent=std::可转换吗;
结构A{};
结构B:A{using parent=A;};
模板int foo(T*){return 1;}
模板int foo(T*)
{
//给另一个打电话?
返回2;
}
int main()
{
B B;
标准::cout
是否可以从
foo(T*)
调用常规
foo(T*)
函数

为了做到这一点,您需要一些方法来区分这两个函数

例如:

template <typename T>               void foo(T);
template <typename T> requires true auto foo(T) -> int;
这里,受约束函数模板返回
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
}
模板
void foo(T);
模板要求为true
无效foo(T参数){
foo(arg);//调用无约束的
}
在这里使用
monostate
有点可爱,因为它实际上不会改变模板实例化的数量(只有一个
monostate
。。
foo(42)
调用第二个,它调用第一个


但最好只添加一个新函数,并让函数模板的无约束版本和约束版本都调用该函数(从某种意义上说,它比
monostate
方法更不神秘).

那么您想调用通用版本,并将
T*
传递给
HasParent T
版本?您可以这样编写通用
foo
template int-foo(T*){return 1;}
,然后执行
foo(T)
,但我希望这不是解决这个问题的唯一方法。@t.niese,这肯定不是唯一的方法,因为总是有一个相对干净的选项,可以将公共部分分解为单独的函数。@chris确定这是一种解决从专用函数调用通用函数的要求的方法(可能是更好的方法),但它不会回答这个问题,如果/如何可能。@chris除了公共部分是整个其他函数外,重载只是用户用父函数递归调用相同的方法,如果可用,我们应该提到
template int foo(t*){if constexpr(HasParent){}else{}
在这个答案中?我非常喜欢在我可以逃脱的情况下不重载。@Casey这实际上是个好主意,因为它实际上也可以解决我的问题;-)@Casey可能?我认为专注于具体问题会更有趣,我有点喜欢monostate模板参数:-)
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
}