gpt4 book ai didi

c++ - SFINAE 不适用于 llvm/clang

转载 作者:行者123 更新时间:2023-11-28 00:56:24 25 4
gpt4 key购买 nike

在下面的代码中,我试图调用一个仿函数,无论它接受什么作为参数,“不管”是一组有限的选项(这里的两个不是我的代码中唯一的)。

#include <memory>
#include <iostream>

template<class T>
struct call_with_pointer {
// last resort: T*
template<class Callable>
static auto call(Callable &callable, const std::shared_ptr<T> &param) -> decltype(callable(param.get())) {
return callable(param.get());
}
};

template<class T>
struct call_with_shared : public call_with_pointer<T> {

// best: call with shared_ptr<T>.
// SFINA
// error: Candidate template ignored: substitution failure [with Callable = Test]: no matching function for call to object of type 'Test'
template<class Callable>
static auto call(Callable &callable, const std::shared_ptr<T> &param) -> decltype(callable(param)) {
return callable(param);
}

using call_with_pointer<T>::call;
};


class Test {
public:
bool operator () (int * x) {
return *x == 42;
}
};

int main ()
{
Test t;

auto i = std::make_shared<int>(4);

auto x = call_with_shared<int>::call(t, i); // No matching function for call to 'call'

return 0;
}

此代码在 VS 和 GCC 中运行良好.不幸的是,它不在 clang 中。错误信息是:

No matching function for call to 'call'

Candidate template ignored: substitution failure [with Callable = Test]: no matching function for call to object of type 'Test'

所以它忽略了使用智能指针的候选者。好的。但它似乎并没有继续考虑可以正常工作的继承调用。

问题:我该如何解决这个问题?我怎样才能让 llvm 在这里做正确的事情?

最佳答案

尝试以下操作:

template<class T>
struct call_with_pointer {
// last resort: T*
template<class Callable>
static auto call(Callable &callable, const std::shared_ptr<T> &param) -> decltype(callable(param.get())) {
return callable(param.get());
}
};

template<class T>
struct call_with_pointer_2 {
// last resort: T*
template<class Callable>
static auto call(Callable &callable, const std::shared_ptr<T> &param) -> decltype(callable(param)) {
return callable(param);
}
};

template<class T>
struct call_with_shared : public call_with_pointer<T>, public call_with_pointer_2<T>{
using call_with_pointer<T>::call;
using call_with_pointer_2<T>::call;
};

关于c++ - SFINAE 不适用于 llvm/clang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11019781/

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