2010-07-15 3 views
0

Возможно ли это?Можно ли объявить указатель void на функцию шаблона в C++?

Если я понял правильно, указатель void может указывать на любой тип. Следовательно, возможна функция шаблона (необъявленный тип)? или указатель void является только резервным для «переменной», а не функцией? Тогда как насчет указателя функции void?

ответ

1

Вы можете использовать любой тип указателя функции для любого другого, но перед тем, как вы его вызовете, вы должны применить его к правильному типу. Поэтому вы можете использовать void(*)() в качестве эквивалента void* для указателей функций. Это также работает с шаблонами функций.

template<typename T> 
void f(T){} 

typedef void(*voidfp)(); 

voidfp fp=static_cast<voidfp>(&f<int>); // store address of f(int) in variable 
static_cast<void(*)(int)>(fp)(3); // call the function 

fp=static_cast<voidfp>(&f<std::string>); // store address of f(std::string) in variable 
static_cast<void(*)(std::string)>(fp)("hello"); // call the function 
0

Согласно стандарту, пустота * является не требуется, чтобы быть в состоянии держать указатель на функцию. (Это -, для хранения указателя на любые данные). Тем не менее, большинство процессоров процессора, которые вы, вероятно, увидите в эти дни, имеют указатели данных & указатели на функции одинакового размера.

0

Здесь есть проблема, из-за используемых слов я боюсь.

Существует разница между указателей и указателей на функции, в первую очередь, они не должны быть одинакового размера.

Поэтому для определения адреса указателя функции используется неопределенное поведение void*.

В целом, на C++ не рекомендуется использовать void*. Они необходимы в C из-за отсутствия надлежащей системы типов, но система типа C++ намного более развита (хотя и не так развита, как последние языки).

Возможно, вы, возможно, выиграете от некоторой объективации. Если вы сделаете свой метод экземпляром класса (шаблона), вы можете получить этот класс из общего базового класса. Это довольно часто, эти объекты называются Функциями.

Однако, без точного описания вашей проблемы, будет трудно помочь больше.

0

сделать это с помощью шаблонов, которые нужны некоторые фокусы, иначе компилятор не может неоднозначность функции (это на самом деле не рекомендуется, его ужасно читать, и, вероятно, нарушает несколько тысяч porgamming лучшие практики)

IE: это не работает (по крайней мере под VS08 & GCC 3.5):

template <typename tType> tType* GetNULLType() 
{ 
    return static_cast<tType*>(0); 
} 

void* pf = static_cast<void*>(GetNULLType<int>); 

вы вместо этого нужно сделать:

template <typename tType> tType* GetNULLType() 
{ 
    return static_cast<tType*>(0); 
} 

typedef int* (*t_pointer)(); 
t_pointer pfGetNull = GetNULLType<int>; 
void* pfVoid = (void*)(pfGetNull); 

(d до того, как пуристы стонут, похоже, «безопасное» литье в стиле C++ не позволит этого)

Смежные вопросы