相关疑难解决方法(0)

是否可以编写模板来检查函数的存在?

是否可以编写一个模板来改变行为,具体取决于是否在类上定义了某个成员函数?

这是我想写的一个简单例子:

template<class T>
std::string optionalToString(T* obj)
{
    if (FUNCTION_EXISTS(T->toString))
        return obj->toString();
    else
        return "toString not defined";
}
Run Code Online (Sandbox Code Playgroud)

所以,如果class T已经toString()确定的话,就使用它; 否则,它没有.我不知道怎么做的神奇部分是"FUNCTION_EXISTS"部分.

c++ templates sfinae template-meta-programming

458
推荐指数
20
解决办法
14万
查看次数

可以在C++ 11中模拟std :: is_invocable吗?

我想使用std :: is_invocable,但我们使用的是c ++ 11标准,而is_invocable只能从c ++ 17获得.

有没有办法使用c ++ 11模拟功能?

谢谢

c++ c++11 c++17

9
推荐指数
1
解决办法
1085
查看次数

C++ 11:模板参数中的SFINAE,GCC vs Clang

我想实现一个小的trait类来确定一个类型是否已operator()正确重载,以便我可以查询类似的类型:

FunctorCheck<F, void(int, char)>::value
Run Code Online (Sandbox Code Playgroud)

最初,我对如何从这个问题实现这个问题有了一个想法,但在看了一篇关于TMPCppcon讲座之后,我突然意识到这个问题可以更优雅地解决.这就是我想出来的,它在Clang 3.5.0上编译并运行完美:

template <typename ...>
using void_t = void;

template <typename Functor, typename ... Args>
using FunctorReturn = decltype(declval<Functor>()(declval<Args>()...));

template <typename Functor, typename Signature, typename = void>
struct FunctorCheck: public std::false_type
{};

template <typename Functor, typename R, typename ... Args>
struct FunctorCheck<Functor, R(Args...), 
    void_t<FunctorReturn<Functor, Args ...>> // SFINAE can kick in here
> : public std::is_same<R, FunctorReturn<Functor, Args ...>>::type
{};
Run Code Online (Sandbox Code Playgroud)

您可能已经注意到,我正在使用建议的C++ 17 void_t在专业化的模板参数中利用SFINAE.当FunctorReturn收到 …

gcc templates clang sfinae c++11

6
推荐指数
1
解决办法
802
查看次数

如何实现std :: is_constructible <T,Args>?

到目前为止我在网上找不到任何ELI5.对于学习项目,我想实现自己的is_constructible.有人可以解释它是如何工作的吗?

c++ type-traits c++-standard-library c++11

6
推荐指数
1
解决办法
1773
查看次数