小编Dom*_*kar的帖子

如果变量是c ++中的类,结构或基本类型,有没有办法编译时断言?

我正在尝试实现一个模板类,它能够告诉我变量是类,结构还是基本类型.

到目前为止,我已经来了:

template< typename T >
class is_class
{
private:
    template< typename X >
    static char ( &i_class( void(X::*)() ) )[1];
    //
    template< typename X >
    static char ( &i_class( X ) )[2];
public:
    static bool const val = sizeof( i_class< T >(0) ) == 1;
};
Run Code Online (Sandbox Code Playgroud)

和ussage:

is_class< int >::val; // false
is_class< some_class_type >::val; // true
Run Code Online (Sandbox Code Playgroud)

问题是现在我需要在每个可以与此代码一起使用的类中编写一个空白的void函数.

有谁知道这个问题的解决方案?

c++ templates typechecking

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

使用 decltype 作为构造函数参数

我很好奇为什么在这种情况下成员声明的顺序是一个问题:

\n\n
class A\n{\npublic:\n    A(decltype(b_) b)\n        : b_{b}\n    {}\n\nprivate:\n    std::function<void(int, std::string, float)> b_;\n};\n\n// error: \xe2\x80\x98b_\xe2\x80\x99 was not declared in this scope\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

而仅更改声明顺序即可:

\n\n
class A\n{\n    std::function<void(int, std::string, float)> b_;\n\npublic:\n    A(decltype(b_) b)\n        : b_{b}\n    {}\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

由于 gcc 和 Clang 都以相同的方式处理它,我会说这不是一个错误,但我仍然觉得它令人困惑。

\n

c++ c++17

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

比较 std::string_view 和子字符串 string_view

假设我们有一个 string_view 和另一个 string_view,它是第一个 string_view 的子集:

using namespace std; // just to shorten the example...

string_view s{"abc def"};
auto t = s.substr(4);
auto u = s.substr(0, 4);

cout << *(s.begin() + 4) << "  " << *t.begin() << '\n';
cout << ((s.begin() + 4) == t.begin());
cout << (s.end() == t.end());
cout << ((s.begin() +5) == t.begin());
cout << ((s.begin() +5) == (t.begin() + 1));
cout << ((s.begin() + 4) == u.end()); // true
Run Code Online (Sandbox Code Playgroud)

所有比较都可以在 gcc (9 HEAD) 和 clang …

c++ std string-view c++17

0
推荐指数
1
解决办法
2737
查看次数

标签 统计

c++ ×3

c++17 ×2

std ×1

string-view ×1

templates ×1

typechecking ×1