Tôi không chắc liệu trình biên dịch có giúp bạn bằng cách trực tiếp cung cấp một số cờ biên dịch hay không. Nếu có, tốt cho bạn. Dùng nó. Kết thúc câu chuyện.
Nếu không, thì có thể điều này sẽ giúp bạn. Vì bạn đang chuyển đổi mã của bạn từ C sang C++, điều đó có nghĩa là tất cả việc sử dụng memset là không có không gian tên std::
. Vì vậy, tận dụng lợi thế của thực tế này và #define memset
như:
#define memset memset_if_pod_else_error()
Đây memset_if_pod_else_error
là một chức năng được viết bởi bạn (nghĩa là bạn phải thực hiện nó). Bạn có thể làm cho nó mẫu để suy ra loại đối số và sau đó phát hiện cho dù loại là POD hay không. Nếu đó là POD, thì điều đó là tốt và gọi số std::memset
nội bộ, nếu không thì sẽ tăng lỗi.
Các chức năng như std::enable_if
và std::is_pod
sẽ giúp bạn triển khai chức năng này.
Đây là một bản demo tối thiểu của ý tưởng này:
#include <iostream>
#include <type_traits>
#include <cstring>
auto ptr_memset = std::memset; //store this a pointer
template<typename T>
using VoidPtr = typename std::enable_if<std::is_pod<T>::value, void*>::type;
#define memset memset_if_pod_else_error
template<typename T>
VoidPtr<T> memset_if_pod_else_error(T *data, int ch, size_t count)
{
return ptr_memset(data, ch, count);
}
struct pod {};
struct nonpod { nonpod() {} };
int main()
{
pod p;
nonpod np;
memset(&p, 0, sizeof(p));
memset(&np, 0, sizeof(np)); //this is error!
}
Cuộc gọi thứ hai để memset
tạo ra lỗi này:
error: no matching function for call to 'memset_if_pod_else_error'
memset(&np, 0, sizeof(np));
^~~~~~
Online Demo.
Hy vọng điều đó sẽ hữu ích.
'grep'ing cho' memset' có tăng quá nhiều kết quả để kiểm tra thủ công không? Nếu không, tôi không thấy một cách để trình biên dịch kiểm tra điều này. – arne
@arne Đó là một phần của vấn đề, vâng. – Henrik