remove const
От: Sergey Россия  
Дата: 27.12.04 10:09
Оценка:
Hello, All!

Есть некий тип, заданный примерно так:
typedef void int (func_type)(int, double) const;


Есть ли какой-нибудь способ (я, конечно, подозреваю, что нет, но вдруг?)
получить из этого типа то же самое, но без константности? Потому что с
константностью boost::function_traits не дружат, а переписывать
function_traits влом.

With best regards, Sergey.
Posted via RSDN NNTP Server 1.9 delta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: remove const
От: Lapulya  
Дата: 27.12.04 10:40
Оценка:
Здравствуйте, Sergey, Вы писали:

S>Hello, All!


S>Есть некий тип, заданный примерно так:

S>
S>typedef void int (func_type)(int, double) const;
S>


чего то я эту строчку переварить не могу... что это void int .... короче чего то я не догоняю, чего тут написано
Re[2]: remove const
От: Sergey Россия  
Дата: 27.12.04 10:51
Оценка:
Hello, Lapulya!
You wrote on Mon, 27 Dec 2004 10:40:27 GMT:

S>> Есть некий тип, заданный примерно так:

S>>
 S>> typedef void int (func_type)(int, double) const;
 S>>


L> чего то я эту строчку переварить не могу... что это void int ....

L> короче чего то я не догоняю, чего тут написано

Это тайпдеф для типа функции. Чтобы определить функцию-член класса, я пишу
так:
#define SR_METHOD(ReturnTypeName, FunctionName, ArgTypes) \

typedef ReturnTypeName (FunctionName##_type)ArgTypes; \

FunctionName##_type FunctionName

#define SR_VIRTUAL_METHOD(ReturnTypeName, FunctionName, ArgTypes) \

typedef ReturnTypeName (FunctionName##_type)ArgTypes; \

virtual FunctionName##_type FunctionName

class A
{
SR_METHOD(int, func, (int, double));
};

Это такой самопальный rpc. Хотелось добавить поддержку константных функций,
да видно не судьба.

With best regards, Sergey.
Posted via RSDN NNTP Server 1.9 delta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[3]: remove const
От: Аноним  
Дата: 27.12.04 11:16
Оценка:
а что же все-таки такое void int и является ли наличие const единственной проблемой?
Re[4]: remove const
От: Sergey Россия  
Дата: 27.12.04 11:20
Оценка:
Hello, !
You wrote on Mon, 27 Dec 2004 11:16:56 GMT:

> а что же все-таки такое void int

Опечатка, естественно. Я сразу и не заметил.

> и является ли наличие const единственной проблемой?

Еще static не умею

With best regards, Sergey.
Posted via RSDN NNTP Server 1.9 delta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: remove const
От: yxiie Украина www.enkord.com
Дата: 27.12.04 14:57
Оценка:
Здравствуйте, Sergey, Вы писали:

S>Hello, All!


S>Есть некий тип, заданный примерно так:

S>
S>typedef void int (func_type)(int, double) const;
S>


S>Есть ли какой-нибудь способ (я, конечно, подозреваю, что нет, но вдруг?)

S>получить из этого типа то же самое, но без константности? Потому что с
S>константностью boost::function_traits не дружат, а переписывать
S>function_traits влом.

во первых void int это что-то из другого мира.
во вторых,
во вторых — const может иметь только нестатичестка ф-ция-член класса, тоесть:
S>
S>typedef int (test::*func_type)(int, double) const;
S>

и в третьих, что обычный С-style cast разве не катит?
class test {
public:

    int f(int, double) {
        return 0;
    }

    int f_const(int, double) const {
        return 0;
    }

};

typedef int (test::*func_type)(int, double);
typedef int (test::*func_type_const)(int, double) const;

int main() {
    func_type_const fc=test::f_const;
    func_type fnc=(func_type)fc;

    return 0;
}
... << RSDN@Home 1.1.3 stable >>
Re[2]: remove const
От: Sergey Россия  
Дата: 27.12.04 15:14
Оценка: +1
Hello, yxiie!
You wrote on Mon, 27 Dec 2004 14:57:55 GMT:

S>> Есть некий тип, заданный примерно так:

S>>
 S>> typedef void int (func_type)(int, double) const;
 S>>


S>> Есть ли какой-нибудь способ (я, конечно, подозреваю, что нет, но

S>> вдруг?) получить из этого типа то же самое, но без константности?
S>> Потому что с константностью boost::function_traits не дружат, а
S>> переписывать function_traits влом.

y> во первых void int это что-то из другого мира.


Да, это опечатка.

y> во вторых,

y> во вторых — const может иметь только нестатичестка ф-ция-член класса,
y> тоесть:
S>>
 S>> typedef int (test::*func_type)(int, double) const;
 S>>


Не совсем так. Такой код:
typedef int (func_type)(int, double) const;

вполне легален, если использовать его должным образом. Например, так:
struct A
{
    func_type func;
};

Ну а с помощью твоего тайпдефа функцию-член не определишь, только указатель
на функцию-член.

y> и в третьих, что обычный С-style cast разве не катит?


У меня нет никаких указателей на функцию, которые надо кастить. Вообще
ничего кастить не надо. У меня есть func_type, определенный с помощью
typedef — мне надо из него сделать тайпдеф для функции с такой же
сигнатурой, но без константности. Который мне нужен для того, чтобы
впоследствии написать boost::function_traits<func_type_nc>::arity. Устроит
также просто возможность отличать тайпдеф на константную функцию от тайпдефа
на неконстантную.

With best regards, Sergey.
Posted via RSDN NNTP Server 1.9 delta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: remove const
От: Андрей Тарасевич Беларусь  
Дата: 27.12.04 18:13
Оценка:
Здравствуйте, yxiie, Вы писали:

Y>во вторых — const может иметь только нестатичестка ф-ция-член класса, тоесть:

S>>
S>>typedef int (test::*func_type)(int, double) const;
S>>


'typedef' функционального типа еще никак не запрещает использования этого типа для объявления методов класса. И такой 'typedef' запросто может включать в себя 'const' для функции, как это было сделано в оригинальном примере.
Best regards,
Андрей Тарасевич
Re: remove const
От: uw  
Дата: 27.12.04 18:47
Оценка: -1
Здравствуйте, Sergey, Вы писали:

S>Есть ли какой-нибудь способ (я, конечно, подозреваю, что нет, но вдруг?)

S>получить из этого типа то же самое, но без константности? Потому что с
S>константностью boost::function_traits не дружат, а переписывать
S>function_traits влом.

Извини за наивный вопрос.
А так ты пробовал?
template <typename T> struct naive_unconst
{
};

template <typename R,typename P0,typename P1> struct naive_unconst<R (P0,P1)>
{
    typedef R (type)(P0,P1);
};
Re[2]: remove const
От: Sergey Россия  
Дата: 28.12.04 10:38
Оценка: +1
Hello, uw!
You wrote on Mon, 27 Dec 2004 18:47:21 GMT:

S>> Есть ли какой-нибудь способ (я, конечно, подозреваю, что нет, но

S>> вдруг?) получить из этого типа то же самое, но без константности?
S>> Потому что с константностью boost::function_traits не дружат, а
S>> переписывать function_traits влом.

u> Извини за наивный вопрос.

u> А так ты пробовал?
u>
 u> template <typename T> struct naive_unconst
 u> {
 u> };

 u> template <typename R,typename P0,typename P1> struct naive_unconst<R
 u> (P0,P1)> {
 u>     typedef R (type)(P0,P1);
 u> };
 u>


Не, так пока не пробовал. Но это ж 20 штук специализаций писать, проще тогда
бустоводам помочь и function_traits поправить.

With best regards, Sergey.
Posted via RSDN NNTP Server 1.9 delta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[3]: remove const
От: yxiie Украина www.enkord.com
Дата: 28.12.04 11:09
Оценка: +1
Здравствуйте, Sergey, Вы писали:

S>Не, так пока не пробовал. Но это ж 20 штук специализаций писать, проще тогда

S>бустоводам помочь и function_traits поправить.

возьми boost::preprocessor и напиши один раз
... << RSDN@Home 1.1.3 stable >>
Re[4]: remove const
От: Sergey Россия  
Дата: 28.12.04 11:46
Оценка:
Hello, yxiie!
You wrote on Tue, 28 Dec 2004 11:09:32 GMT:

S>> Не, так пока не пробовал. Но это ж 20 штук специализаций писать, проще

S>> тогда бустоводам помочь и function_traits поправить.

y> возьми boost::preprocessor и напиши один раз


Все равно не вижу у такого решения ни одного преимущества перед правкой
буста.

With best regards, Sergey.
Posted via RSDN NNTP Server 1.9 delta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[5]: remove const
От: korzhik Россия  
Дата: 28.12.04 11:49
Оценка: +1
Здравствуйте, Sergey, Вы писали:

S>>> Не, так пока не пробовал. Но это ж 20 штук специализаций писать, проще

S>>> тогда бустоводам помочь и function_traits поправить.

y>> возьми boost::preprocessor и напиши один раз


S>Все равно не вижу у такого решения ни одного преимущества перед правкой

S>буста.

легче поддерживать.
через некоторое время захотите скачать себе новую версию буста, придётся и её править, потом ещё раз и ещё.
А свой код — один раз написали, отладили и всё.
Re[6]: remove const
От: Sergey Россия  
Дата: 28.12.04 12:07
Оценка: +1
Hello, korzhik!
You wrote on Tue, 28 Dec 2004 11:49:17 GMT:

y>>> возьми boost::preprocessor и напиши один раз


S>> Все равно не вижу у такого решения ни одного преимущества перед правкой

S>> буста.

k> легче поддерживать.

k> через некоторое время захотите скачать себе новую версию буста, придётся
k> и её править, потом ещё раз и ещё. А свой код — один раз написали,
k> отладили и всё.

Да не, я ж ее если поправлю то попробую бустоводам отдать. Если не возьмут,
такая правка может просто в отдельном хедере лежать.

With best regards, Sergey.
Posted via RSDN NNTP Server 1.9 delta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[3]: remove const
От: Аноним  
Дата: 28.12.04 12:11
Оценка:
Здравствуйте, Sergey, Вы писали:

S>Такой код:

S>
S>typedef int (func_type)(int, double) const;
S>

S>вполне легален, если использовать его должным образом. Например, так:
S>
S>struct A
S>{
S>    func_type func;
S>};
S>


Приведите, пожалуйста, небольшой пример использования struct A.

S>With best regards, Sergey.
Re[4]: remove const
От: Sergey Россия  
Дата: 28.12.04 13:13
Оценка:
Hello, !
You wrote on Tue, 28 Dec 2004 12:11:02 GMT:

> Здравствуйте, Sergey, Вы писали:


S>> Такой код:

S>>
 S>> typedef int (func_type)(int, double) const;
 S>>

S>> вполне легален, если использовать его должным образом. Например, так:
S>>
 S>> struct A
 S>> {
 S>>    func_type func;
 S>> };
 S>>


> Приведите, пожалуйста, небольшой пример использования struct A.


А что непонятно? Дальше в где нибудь пишешь definition функции
int A::func(int, double) const
{
    std::cout << "test - in foo" << std::endl;
}


Ну и используешь потом как обычно.

With best regards, Sergey.
Posted via RSDN NNTP Server 1.9 delta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: remove const
От: Sergey Россия  
Дата: 28.12.04 14:43
Оценка:
Hello, uw!
You wrote on Mon, 27 Dec 2004 18:47:21 GMT:

u> Извини за наивный вопрос.

u> А так ты пробовал?
u>
 u> template <typename T> struct naive_unconst
 u> {
 u> };

 u> template <typename R,typename P0,typename P1> struct naive_unconst<R
 u> (P0,P1)> {
 u>     typedef R (type)(P0,P1);
 u> };
 u>


Кстати, так не получается — специализация не совпадает. И так:
template <typename R,typename P0,typename P1> struct naive_unconst<R (P0,P1) 
const> {
typedef R (type)(P0,P1);
};

тоже не получается — ругается, что "modifiers not allowed on nonmember
functions" (C2270). По этой же причине и function_traits в этом направлении
фиг поправишь. Кстати, кто-нибудь знает, зачем в function_traits пляски с
add_pointer и соответствующими специализациями ?

With best regards, Sergey.
Posted via RSDN NNTP Server 1.9 delta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: remove const
От: ReV01VeR  
Дата: 29.12.04 11:04
Оценка: 20 (2)
Здравствуйте, Sergey, Вы писали:

S>Hello, All!


S>Есть некий тип, заданный примерно так:

S>
S>typedef void int (func_type)(int, double) const;
S>


S>Есть ли какой-нибудь способ (я, конечно, подозреваю, что нет, но вдруг?)

S>получить из этого типа то же самое, но без константности? Потому что с
S>константностью boost::function_traits не дружат, а переписывать
S>function_traits влом.

S>With best regards, Sergey.


Работает на VC7.1:

#include <iostream>
#include <typeinfo>

typedef int (FType)(int, double) const;

class Foo;

template <typename T>
struct Unconst;

template <class T, typename R, typename A1, typename A2>
struct Unconst<R (T::*)(A1, A2) const>
{
  typedef R (Type)(A1, A2);
};
template <class T, typename R, typename A1, typename A2>
struct Unconst<R (T::*)(A1, A2)>
{
  typedef R (Type)(A1, A2);
};

int _tmain(int argc, _TCHAR* argv[])
{
    std::cout << "FuncType:      " << typeid(FType).name() << std::endl;
    std::cout << "MembType:      " << typeid(FType Foo::*).name() << std::endl;
    std::cout << "Unconsted:     " << typeid(Unconst<FType Foo::*>::Type).name() << std::endl;
    std::cout << "MembUnconsted: " << typeid(Unconst<FType Foo::*>::Type Foo::*).name() << std::endl;
    std::cin.get();
    return 0;
}


Только специализации на каждое количество аргументов писать придется ...
Re[2]: remove const
От: Sergey Россия  
Дата: 18.01.05 16:23
Оценка:
Здравствуйте, ReV01VeR, Вы писали:

RVV>Работает на VC7.1:


RVV>
RVV>#include <iostream>
RVV>#include <typeinfo>

RVV>typedef int (FType)(int, double) const;

RVV>class Foo;

RVV>template <typename T>
RVV>struct Unconst;

RVV>template <class T, typename R, typename A1, typename A2>
RVV>struct Unconst<R (T::*)(A1, A2) const>
RVV>{
RVV>  typedef R (Type)(A1, A2);
RVV>};
RVV>template <class T, typename R, typename A1, typename A2>
RVV>struct Unconst<R (T::*)(A1, A2)>
RVV>{
RVV>  typedef R (Type)(A1, A2);
RVV>};

RVV>int _tmain(int argc, _TCHAR* argv[])
RVV>{
RVV>    std::cout << "FuncType:      " << typeid(FType).name() << std::endl;
RVV>    std::cout << "MembType:      " << typeid(FType Foo::*).name() << std::endl;
RVV>    std::cout << "Unconsted:     " << typeid(Unconst<FType Foo::*>::Type).name() << std::endl;
RVV>    std::cout << "MembUnconsted: " << typeid(Unconst<FType Foo::*>::Type Foo::*).name() << std::endl;
RVV>    std::cin.get();
RVV>    return 0;
RVV>}
RVV>


RVV>Только специализации на каждое количество аргументов писать придется ...


В конечном счете (когда по-настоящему потребовалось поддерживать константные методы) так и пришлось сделать.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.