2015-05-16 4 views
0
template<typename T> 
class Pack 
{ 
private: 
    std::function<T()> _Func = nullptr; 
public: 
    Pack() 
    { 
    } 
    Pack(std::function<T()> func) 
     : _Func(func) 
    { 
    } 
    ~Pack() 
    { 
    } 

    operator T() 
    { 
     return _Func(); 
    } 
}; 

Что я использую operator T, я хочу назвать _Func неявно, но я даже не могу сделать это в явном виде. Кажется правильным, но на самом деле ошибка C2440 @MSVC. Я использую его двумя способами:определяемые пользователем C++ тип Ошибка преобразования

  1. статический член класса (преуспел);

  2. член класса (не удалось)

(я не знаю, имеет ли он или нет)

Я действительно интересно, почему она работает в двух направлениях, и что еще более важно, как я могу поместить его в мой класс как нестатический член и успешно вызвать operator T.

+0

Вам необходимо связать нестационарную функцию с объектом: Возможно [это] (http://stackoverflow.com/questions/7582546/using-generic-stdfunction-objects-with-member-functions-in-one -класс). – namezero

+0

@namezero param - это выражение лямбда, которое фиксирует все ссылки в классе. Это же решение? – PENGUINLIONG

+0

@namezero В чем вопрос? ваш пример отлично работает. –

ответ

2

Член класса:

struct test 
{ 
    test() 
    { 
     p_ = Pack<int>(std::bind(&test::foo, *this)); 
    } 

    int foo() 
    { 
     std::cout << "test::foo" << std::endl; 
     return 5; 
    } 

    Pack<int> p_; 
}; 

int main() 
{ 
    test t; 
    int x = t.p_; 

    return 0; 
} 

Это прекрасно работает на VS 2013 EE.

+0

Я имею в виду, что пакет находится в классе, и я хочу использовать его в main() через экземпляр класса – PENGUINLIONG

+0

@PENGUINLIONG, обновленный, это то, что вы имели в виду? – doqtor

+0

Да, но почему это провалилось на моей машине, это странно ... – PENGUINLIONG

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