Я не уверен, что компилятор поможет вам там, непосредственно предоставив некоторые флаговые компиляции. Если это так, хорошо для вас. Используйте это. Конец истории.
Если это не так, то, возможно, это поможет вам. Поскольку вы конвертируете свой код с C на C++, это означает, что все использование memset не имеет пространства имен std::
. Таким образом, воспользоваться этим фактом и #define memset
как:
#define memset memset_if_pod_else_error()
Здесь memset_if_pod_else_error
функция, написанная вами (то есть у вас есть для его реализации). Вы можете сделать его шаблоном, чтобы вывести тип аргумента, а затем определить, является ли тип POD или нет. Если это POD, тогда это нормально, и вызовите std::memset
внутренне, иначе повысите ошибку.
Метафоры, такие как std::enable_if
и std::is_pod
, помогут вам реализовать эту функцию.
Вот минимальный демо этой идеи:
#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!
}
Второй вызов memset
формирует эту ошибку:
error: no matching function for call to 'memset_if_pod_else_error'
memset(&np, 0, sizeof(np));
^~~~~~
Online Demo.
Надеюсь, что это поможет.
Неужели 'grep'ing для' memset' слишком много результатов проверяет вручную? В противном случае я не вижу возможности для компилятора проверить это. – arne
@arne Это часть проблемы, да. – Henrik