首页 > 解决方案 > 模板类没有实例构造函数

问题描述

我希望能够使我的 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
};

标签: c++c++17

解决方案


您可以直接提供构造函数参数,无需通过另一个WrapFuncObj函数转换间接提供。它的工作方式与您使用它的方式相同_dll

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

请注意,数据成员的默认初始化程序不允许使用括号进行初始化,您需要使用大括号。


推荐阅读