#include <type_traits>
template<class As>
struct any_char_ptr
{
static const bool is_const = std::is_const<As>::value;
typedef typename std::conditional<is_const,const char,char>::type
plain_char_type;
typedef typename std::conditional<is_const,const signed char,signed char>::type
signed_char_type;
typedef typename std::conditional<is_const,const unsigned char,unsigned char>::type
unsigned_char_type;
As* ptr;
any_char_ptr(plain_char_type* p)
: ptr(reinterpret_cast<As*>(p)) {}
any_char_ptr(signed_char_type* p)
: ptr(reinterpret_cast<As*>(p)) {}
any_char_ptr(unsigned_char_type* p)
: ptr(reinterpret_cast<As*>(p)) {}
operator As*() const {return ptr;}
};
#include <iostream>
void foo(any_char_ptr<unsigned char> p)
{
std::cout << unsigned(*p) << std::endl;
}
int main()
{
char c=65; signed char s=66; unsigned char u=67;
foo(&c);
foo(&s);
foo(&u);
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGU8Y2xhc3MgQXM+CnN0cnVjdCBhbnlfY2hhcl9wdHIKewogIHN0YXRpYyBjb25zdCBib29sIGlzX2NvbnN0ID0gc3RkOjppc19jb25zdDxBcz46OnZhbHVlOwoKICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8aXNfY29uc3QsY29uc3QgY2hhcixjaGFyPjo6dHlwZQogICAgICAgICAgcGxhaW5fY2hhcl90eXBlOwogIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxpc19jb25zdCxjb25zdCBzaWduZWQgY2hhcixzaWduZWQgY2hhcj46OnR5cGUKICAgICAgICAgIHNpZ25lZF9jaGFyX3R5cGU7CiAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPGlzX2NvbnN0LGNvbnN0IHVuc2lnbmVkIGNoYXIsdW5zaWduZWQgY2hhcj46OnR5cGUKICAgICAgICAgIHVuc2lnbmVkX2NoYXJfdHlwZTsKCiAgQXMqIHB0cjsKCiAgYW55X2NoYXJfcHRyKHBsYWluX2NoYXJfdHlwZSogcCkKICAgIDogcHRyKHJlaW50ZXJwcmV0X2Nhc3Q8QXMqPihwKSkge30KICBhbnlfY2hhcl9wdHIoc2lnbmVkX2NoYXJfdHlwZSogcCkKICAgIDogcHRyKHJlaW50ZXJwcmV0X2Nhc3Q8QXMqPihwKSkge30KICBhbnlfY2hhcl9wdHIodW5zaWduZWRfY2hhcl90eXBlKiBwKQogICAgOiBwdHIocmVpbnRlcnByZXRfY2FzdDxBcyo+KHApKSB7fQoKICBvcGVyYXRvciBBcyooKSBjb25zdCB7cmV0dXJuIHB0cjt9Cn07CgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp2b2lkIGZvbyhhbnlfY2hhcl9wdHI8dW5zaWduZWQgY2hhcj4gcCkKewogIHN0ZDo6Y291dCA8PCB1bnNpZ25lZCgqcCkgPDwgc3RkOjplbmRsOwp9CgppbnQgbWFpbigpCnsKICBjaGFyIGM9NjU7IHNpZ25lZCBjaGFyIHM9NjY7IHVuc2lnbmVkIGNoYXIgdT02NzsKICBmb28oJmMpOwogIGZvbygmcyk7CiAgZm9vKCZ1KTsKfQo=