我有以下模板类:
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
但我无法解析它。是不是我遗漏了一些微不足道的东西?
答案 0 :(得分:3)
B(typename B<T>::BuilderFcnT)
的问题是您正在尝试使用依赖于 T
的类型,但您正在推导 T
。这就像鸡和蛋的问题。在这种情况下,您只需要
template<typename T> B(T(*)()) -> B<T>;