gpt4 book ai didi

C++ enable_if_t SFINAE

转载 作者:太空狗 更新时间:2023-10-29 20:20:56 26 4
gpt4 key购买 nike

我试图理解为什么这段代码没有按预期工作

#include <cstdio>
#include <vector>
#include <type_traits>
using namespace std;

struct Foo {

};

template<typename T, typename = void>
void compare(const T&a, const T&b) {
cout << "default" << endl;
}

template<typename T, std::enable_if_t<std::is_same<T, Foo>::value>>
void compare(const T& a, const T &b) {
cout << "In object" << endl;
}

int main(int argc, char const *argv[]) {
compare(1, 2);

{
vector<int> a, b;
compare(a, b);
}

{
Foo a, b;
compare(a, b);
}

return 0;
}

在所有情况下都会打印“default”。对于最后一种情况,我希望调用第二个函数。

最佳答案

您没有特化compare(无论如何不可能部分特化一个函数模板)。相反,您提供了一个过载。

并且重载总是非法的:

  1. enable_if_t 未定义。
  2. 或者指定一个void类型的非类型模板参数。

所以它永远不会被调用,因为 SFINAE 放弃它以支持顶部始终有效的重载。

特化通常是函数模板的错误答案。相反,您应该委托(delegate)给一个类模板,它在真正特化时表现得像预期的那样:

template<typename T, typename = void>
struct compare_impl {
static void execute(T const& l, T const& r) { /*Base case code*/ }
};

template<typename T>
struct compare_impl<T, std::enable_if_t<std::is_same<T, Foo>::value>> {
static void execute(T const& l, T const& r) { /*Special case code*/ }
};

template<typename T>
void compare (T const& l, T const& r) { compare_impl<T>::execute(a, b); }

关于C++ enable_if_t SFINAE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46816556/

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