Универсальная прокси-функция.
От: T4r4sB Россия  
Дата: 26.09.15 08:52
Оценка:
Надо написать функцию, которая принимает любой параметр и передаёт его нужной перегрузке другой заранее известной функции.

Пример кода:

#include "stdio.h"

struct CR1
{
    CR1 () 
        { printf("CR1 ctor at %x\n", this); }
    ~CR1 ()                 
        { printf("CR1 dtor at %x\n", this); }
    CR1 (const CR1&)         
        { printf("CR1 copyctor at %x\n", this); }
    CR1& operator = (const CR1&) 
        { printf("CR1 = at %x\n", this); }
};

struct CR2
{
    CR2 () 
        { printf("CR2 ctor at %x\n", this); }
    ~CR2 ()                 
        { printf("CR2 dtor at %x\n", this); }
    CR2 (const CR2&)         
        { printf("CR2 copyctor at %x\n", this); }
    CR2& operator = (const CR2&) 
        { printf("CR2 = at %x\n", this); }
};

struct Base
{    
    Base (const CR1& cr) 
    { printf("const CR1&\n"); }

    Base (CR2& cr) 
    { printf("CR2&\n"); }
};

struct Derived : Base 
{
    template <typename Arg>
    Derived(const Arg& arg) : Base(arg) {} // что сюда писать?
};

int main ()
{    
    {
        CR1 cr;
        Derived der(cr);
    }

    getchar();

    return 0;
}

Допустим, Base переделывать нельзя. Надо, чтобы Derived жрал все конструкторы базы.
Конструктор Derived — типа универсальный передатчик. Но что-то не заладилось.

Сейчас у меня стоит const Arg& arg, и если я попробую передать в конструктор CR2 вместо CR1, то компилятор меня пошлёт, потому что константную ссылку переделать в неконстантную нельзя.

Если я напишу "универсальный конструктор" как Arg& arg, то будет проблема с попыткой передать в него временный объект.
warning C4239: nonstandard extension used : 'argument' : conversion from 'CR1' to 'CR1 &'


Если я напишу его как Arg arg, то проблем никаких не будет. Будет лишь лишнее копирование, что видно по выводу программы.


Написать два конструктора не предлагать, потому что у меня может быть 8 таких параметров.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.