шаблон класса без конструктора экземпляра - PullRequest
0 голосов
/ 09 апреля 2020

Я хочу, чтобы мой Wrapper был короче.

Я не хочу включать decltype(foo) дважды в каждой строке

Как правильно использовать конструктор для быть в состоянии вызвать _foo2, как я пытаюсь.

class Helper {
public:
    Helper(LPCTSTR filename) : _filename(filename) {}
    ~Helper() { }

    template<typename T>
    T CallFunction() {
        return T();
    }

private:
    LPCTSTR _filename;
};

template<typename T> class WrapFuncObj;
template<typename T, typename... Args>
class WrapFuncObj<T(Args...)> {
public:
    WrapFuncObj(Helper* dll, LPCTSTR func) : _dll(dll), _func(func) {}

    T operator()(Args&&... args) {
        return _dll->CallFunction<T>();
    }

private:
    Helper* _dll;
    LPCTSTR _func;
};


class Export {
    Helper _dll{ L"SayHello.dll" };

public:
    WrapFuncObj<decltype(foo)> _foo = WrapFuncObj<decltype(foo)>(&_dll, L"foo"); // works
    WrapFuncObj<decltype(foo)> _foo2 = WrapFuncObj(&_dll, L"foo"); // problem here
};

1 Ответ

0 голосов
/ 09 апреля 2020

Вы можете предоставить аргументы конструктора напрямую, нет необходимости косвенно через другое WrapFuncObj функциональное приведение. Он работает так же, как вы использовали его для _dll:

WrapFuncObj<decltype(foo)> _foo2{&_dll, L"foo"};

Просто имейте в виду, что инициализация с круглыми скобками недопустима для инициализаторов по умолчанию для элементов данных, вам необходимо использовать фигурные скобки.

...