2010-10-26 4 views
1

У меня есть следующий код, который работает, как ожидалось:определение функции и функции типа

#include <iostream> 

using namespace std; 

typedef int (TMyFunc)(int); 

TMyFunc* p; 

int x(int y) 
{ 
    return y*2; 
} 

int main() 
{ 
    p = &x; 
    cout << (*p)(5) << endl; 
} 

То, что я хочу сделать, это пропустить определение x и определить p там прямо. Что-то вроде

TMyFunc p; p(y){return y*2;}.

Возможно ли это? Если да, то как мне это сделать? Если не так?

EDIT:

После просмотра ответов, я думаю, что я должен уточнить: Я хочу, чтобы определение отделиться. то есть определение функции будет в общем объекте. Приложение будет получать указатель на функцию через dlsym. I do нет хочет функция объект. Я хочу знать, могу ли я определить функцию, используя ее тип, который будет содержать заголовочный файл, общий как для общего объекта, так и для приложения. Надеюсь, это получилось правильно :).

EDIT2: Для ВОО :)

Это находится в заголовке, который включен в обоих приложения и общего объекта:

#define FNAME_GET_FACTORY  "GetFactory" 
#define FNAME_GET_FUNCTION_IDS "GetFunctionIDs" 
#define FNAME_GET_PLUGIN_INFO "GetPluginInfo" 

typedef FunctionFactory* (*TpfGetFactory)(); 
typedef size_t (*TpfGetFunctionIDs)(int**); 
typedef PluginInfo* (*TpfGetPluginInfo)(); 

В приложении происходит нечто подобное:

TpfGetFactory pF = (TpfGetFactory)dlsym(pHandle, FNAME_GET_FACTORY); 
//Use pF for anything 

Теперь для этого необходимо определить GetFactory следующим образом:

extern "C" FunctionFactory* FNAME_GET_FACTORY(){//CODE} 

Забыть часть extern "C" на данный момент. Могу ли я определить эту функцию с использованием типа TpfGetFactory, который уже определен? (Это не огромная проблема, которую я знаю, но мне любопытно, возможно ли это :)). То, что я хочу что-то подобное в общем объекте:

TpfGetFactory f; 
f(){//Implementation} 

EDIT3:

Моя попытка:

#include <iostream> 

using namespace std; 

typedef int (TF)(int); 

TF f; 

f(int x) 
{ 
    return x*2; 
} 

int main() 
{ 
    x(3); 
} 

main.cpp:9: error: ISO C++ forbids declaration of ‘f’ with no type 
main.cpp: In function ‘int main()’: 
main.cpp:16: error: ‘x’ was not declared in this scope 
+0

Вы можете добавить некоторые (псевдо) код, описывающий, как вы хотите его использовать? Ваше добавленное описание смущает меня больше, чем это проясняет. – sbi

+0

Удалено тег C, так как нет iostream или пространства имен std в C. – Puppy

ответ

4

Это возможно в C++ 1x, стандарт на следующий C++, как правило, ожидается, в следующем году (что сделало бы его C++ 11, затем). Это позволяет это:

auto p = [](int y){return y*2;}; 

Это зависит от auto было дано новое значение («автоматически вывести тип этой переменной из выражения, инициализирует его») и новые функции лямбда (что позволяет создавать функции на лету).

Возможно, ваш компилятор уже поддерживает это.

0

Это возможно в следующем стандарте C++ через lambdas. Однако в текущем стандарте невозможно определить одну функцию внутри другой.

0

Непосредственно в C++ 98.

Для стандартного C++, то есть C++ 98, проверьте, например. библиотека Boost Lambda.Он позволяет писать выражения типа

for_each(a.begin(), a.end(), std::cout << _1 << ' '); 

C++ 0x добавляет прямую поддержку лямбда-выражений.

Приветствия & НТН,

2

Это прекрасно работает для меня, с текущей C++ 03 Стандарт:.

typedef int (TMyFunc)(int); 

TMyFunc* p; 

int test() 
{ 
    struct LocalClass 
    { 
     static int functionLocal(int y) 
     { 
      return 2; 
     }; 
    }; 

    LocalClass localClass; 
    p = &(LocalClass::functionLocal); 
} 

Но, возможно, это происходит, чтобы быть более сложным, чем писать то, что вы хотели simplify ;-), однако он работает, и вы можете определить свои функции на месте, локально.

Вот некоторые документы о local classes

+0

Как я надеюсь, я разъяснил выше, я не хочу получить функтор :). – nakiya

+1

@Nakiya Это ** НЕ функтор ** это указатель на функцию! здесь нет ** оператора() **, определенного здесь?? он является указателем на функцию, используя тот факт, что мы можем определить локальный класс в C++. Поэтому я могу определить локальную статическую функцию, которая похожа на обычную функцию C! –

+0

Счастье, моя ошибка. Однако, если вы прочитаете мою проблему (EDIT2), вы увидите, что я действительно спрашиваю, могу ли я использовать typedef функции для определения функции. :). Меня здесь вообще не интересуют указатели функций или функторы. Возможно, я слишком запутал проблему, добавив все детали. – nakiya

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