为带有函数指针的模板类指定推导指南

时间:2021-06-28 18:42:21

标签: c++ templates

我有以下模板类:

INSERT INTO [dbo].[TraceData] 
VALUES (N'z', N'0', N'A', N'A', N'2021-06-28', N'Y', N'你好')

我希望用户使用它如下 (我想避免指定类型并让编译器推断它):

double* createSomething(){return new double{};}
template<typename T>
class B {
    public:
    using BuilderFcnT = T (*)();
    explicit B(BuilderFcnT a) : ab(a) {}

    private:
    BuilderFcnT ab;
    
};
//This did not work:
//template<typename T>  B(typename B<T>::BuilderFcnT) -> B<typename std::__invoke_result<typename B<T>::BuilderFcnT>::type>;

int main(){
    B<double*> b{&createSomething};
    //B b{&createSomething}; <- I would like this 
    return 0;
}

但是我收到了 warning in Clang compiler with the flag -Wctad-maybe-unsupported 和 gcc 中的警告。它说我应该为模板类指定推导指南。我尝试了以下方法:

B b{&createSomething};//createSomething takes no arguments and returns a pointer to an object

但我无法解析它。是不是我遗漏了一些微不足道的东西?

1 个答案:

答案 0 :(得分:3)

B(typename B<T>::BuilderFcnT) 的问题是您正在尝试使用依赖于 T 的类型,但您正在推导 T。这就像鸡和蛋的问题。在这种情况下,您只需要

template<typename T>  B(T(*)()) -> B<T>;