我正在尝试实现一个模板类,它能够告诉我变量是类,结构还是基本类型.
到目前为止,我已经来了:
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函数.
有谁知道这个问题的解决方案?
我很好奇为什么在这种情况下成员声明的顺序是一个问题:
\n\nclass 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\nRun Code Online (Sandbox Code Playgroud)\n\n而仅更改声明顺序即可:
\n\nclass A\n{\n std::function<void(int, std::string, float)> b_;\n\npublic:\n A(decltype(b_) b)\n : b_{b}\n {}\n};\nRun Code Online (Sandbox Code Playgroud)\n\n由于 gcc 和 Clang 都以相同的方式处理它,我会说这不是一个错误,但我仍然觉得它令人困惑。
\n假设我们有一个 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 …