相关疑难解决方法(0)

我的is_complete类型特征的实现是否暴露了编译器错误?

我编写了这个C++ 11特征模板来检查类型是否完整:

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

template <typename T, typename = void>
struct is_complete : std::false_type
{};

template <typename T>
struct is_complete<T, void_t<decltype(sizeof(T))>> : std::true_type
{};
Run Code Online (Sandbox Code Playgroud)

并测试它像这样:

struct Complete {};

int main()
{
    std::cout << is_complete<Complete>::value
              << is_complete<class Incomplete>::value
              << '\n';
}
Run Code Online (Sandbox Code Playgroud)

我希望打印测试程序10,这是我用clang 3.4编译它时得到的输出.但是,当使用gcc 4.9编译时,它会打印11- 错误地识别class Incomplete为完整.

我不确定我的代码是否正确,但在我看来,即使它是错误的,它在两个编译器上也应该表现相同.

问题1:是我的代码是否正确?
问题2:我是否在其中一个编译器中发现了错误?

编辑:

我不是要求替换我的代码.我问的是gcc或clang中是否存在错误,以及这个特定结构是否正确.

c++ gcc templates clang c++11

26
推荐指数
1
解决办法
911
查看次数

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

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

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

最初,我对如何从这个问题实现这个问题有了一个想法,但在看了一篇关于TMP的Cppcon讲座之后,我突然意识到这个问题可以更优雅地解决.这就是我想出来的,它在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
查看次数

标签 统计

c++11 ×2

clang ×2

gcc ×2

templates ×2

c++ ×1

sfinae ×1