相关疑难解决方法(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
查看次数

为什么void_t <>检测成语不适用于gcc-4.9?

请考虑以下代码:

#include <iostream>
#include <type_traits>

struct Test { Test& operator++(); };
struct NoIncrement { };

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

template <class, class=void_t<>>
struct has_pre_increment_member : std::false_type { };

template <class T>
struct has_pre_increment_member<T, void_t<decltype( ++std::declval<T&>() )>>
  : public std::true_type { };

int main() {
  std::cout << has_pre_increment_member<Test>::value << " ";
  std::cout << has_pre_increment_member<NoIncrement>::value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

使用g ++版本5及更高版本(当然还有-std = c ++ 14标志),此代码输出

1 0
Run Code Online (Sandbox Code Playgroud)

正如它应该.但是,使用g ++版本4.9(以及-std = c ++ 14标志),它会输出

1 1
Run Code Online (Sandbox Code Playgroud)

两者都声称使用相同的语言标准,那么这里的问题是什么?

c++ templates g++ sfinae c++14

14
推荐指数
1
解决办法
762
查看次数

是否可以使用is_functor C++特征类?

如果参数是C++函数对象(仿函数),我如何静态推导出?

template <typename F>
void test(F f) {}
Run Code Online (Sandbox Code Playgroud)

我试过了is_function<F>::value,但这不起作用.它似乎也没有is_functor特质,所以也许这是不可能的.我似乎只是在寻找一个特定的成员函数,在本例中是函数调用操作符:F::operator().

c++ traits functor type-traits c++11

12
推荐指数
2
解决办法
2493
查看次数

使用以下has_member函数,SFINAE无法正常工作?

我正在尝试Walter Brown的TMP演讲中的例子,我正在尝试让他的has_member实现工作.

然而,实现似乎错误地返回true,这使我相信有一些我不理解的SFINAE的细节.

#include <iostream>
#include <type_traits>

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

template <class, class = void>
struct has_type_member: std::false_type {};

template <class T> 
struct has_type_member<T, void_t<typename T::type> >: std::true_type {};

struct FooWithType
{
    typedef int type;
};

struct FooNoType 
{
};

int main()
{
    std::cout << "Does FooWithType have type member? " << 
        (has_type_member<FooWithType>() ? "YES" : "NO") << "\n";

    std::cout << "Does FooNoType have type member? " << 
        (has_type_member<FooNoType>() ? "YES" : …
Run Code Online (Sandbox Code Playgroud)

c++ templates sfinae template-specialization c++11

8
推荐指数
1
解决办法
337
查看次数