I have a template class which takes as its first template argument a foo * pointer. I\'d like to instantiate one of these with a foo located at an absolute address, like so:
Have you try casting the pointer address to and from uintptr_t
, which is an unsigned integer capable of holding a pointer value?
The type is defined in a standard header
but it is only optional. If it does not exist in your version of C++, try size_t
instead.
A full example would then look like:
#include
class foo
{
int baz;
};
template class bar
{
constexpr static const foo* f = (foo*)(addr);
public:
bar() {}
void update() { }
};
#define FOO_ADDR ((uintptr_t)0x80103400)
int main() {
bar myFoo;
}
The obvious drawback is that there is no typechecking at the template parameter. You pass a value which will hopefully refer to foo
object and not a different one.
Not to mention that we are in the undefined behavior world as far as the standard goes....
You seem to be able to compile with the line
constexpr static const foo* f = reinterpret_cast(addr);
with at least some of the compilers as well (http://coliru.stacked-crooked.com/a/5af62bedecf2d75a)
If your compiler rejects casting in the context of constexpr
as it is ill-formed (as per Barry's comment) you can define it as a regular static const
variable:
template
class bar
{
static const foo* f;
public:
bar() {}
void update() { }
};
template
const foo* bar::f = reinterpret_cast(addr);
Less ideal but solves that problem hopefully.