C++ c++;模板参数类型推断
我有一个C语言的模板++C++ c++;模板参数类型推断,c++,templates,type-inference,inferred-type,c++17,c++14,C++,Templates,Type Inference,Inferred Type,C++17,C++14,我有一个C语言的模板++ template<typename T, T* P> struct Ptr {}; 让编译器自己计算出int类型部分 我如何声明我的模板来执行此操作 我读过这个问题,但答案是使用宏,这不好: 我可以只使用模板而不使用宏吗?我使用Visual C++ 2013。< /P> < P> 更新< /强> < /P> 引入了“”,允许使用auto作为实际类型的占位符声明非类型模板参数: template <auto P> struct Ptr {};
template<typename T, T* P> struct Ptr {};
让编译器自己计算出int
类型部分
我如何声明我的模板来执行此操作
我读过这个问题,但答案是使用宏,这不好:
我可以只使用模板而不使用宏吗?我使用Visual C++ 2013。< /P> < P> <强>更新< /强> < /P> 引入了“”,允许使用
auto
作为实际类型的占位符声明非类型模板参数:
template <auto P> struct Ptr {};
请注意,使用auto
的语法甚至足以进行更详细的检查,例如:
template <typename F>
struct FunctionBase;
template <typename R, typename... Args>
struct FunctionBase<R(*)(Args...)> {};
template <auto F>
struct Function : FunctionBase<decltype(F)> {};
类似的提案包括在:
两个人的T
激励性的例子是一种假定的反映型特质,它赋予了一个类成员的属性
struct A {
void f(int i);
double g(size_t s);
};
/* ... */
cout << describe<&A::f>::name; // Prints "f"
cout << describe<&A::g>::arity; // prints 1
这两个提案的当前状态可在下跟踪
还有其他一些建议使用auto
的替代语法:
template <auto T> struct describe;
模板结构描述;
更新
引入了“”,允许使用auto
作为实际类型的占位符声明非类型模板参数:
template <auto P> struct Ptr {};
请注意,使用auto
的语法甚至足以进行更详细的检查,例如:
template <typename F>
struct FunctionBase;
template <typename R, typename... Args>
struct FunctionBase<R(*)(Args...)> {};
template <auto F>
struct Function : FunctionBase<decltype(F)> {};
类似的提案包括在:
两个人的T
激励性的例子是一种假定的反映型特质,它赋予了一个类成员的属性
struct A {
void f(int i);
double g(size_t s);
};
/* ... */
cout << describe<&A::f>::name; // Prints "f"
cout << describe<&A::g>::arity; // prints 1
这两个提案的当前状态可在下跟踪
还有其他一些建议使用auto
的替代语法:
template <auto T> struct describe;
模板结构描述;
如果你能详细解释一下你想达到的目的是什么,也许吧?我想这是不可能的;在声明Ptr Ptr时,至少需要指定int
,然后您希望为对象指定一个参数,以便需要再次指定它:Ptr Ptr代码>或类似于std::shared_ptr
:ptr ptr(&i)代码>@JohnZwinck我想petric更多的是问OP的目标是什么(为什么他想这样做)。所讨论的问题似乎是一个奇怪的问题。@petric更具体地说,Ptr结构可以有T get(){return*P;}
和set(T value){*P=value;}
等成员。这正是,如果你能详细地解释一下你想达到什么目的,我想这是不可能的;在声明Ptr Ptr时,至少需要指定int
,然后您希望为对象指定一个参数,以便需要再次指定它:Ptr Ptr代码>或类似于std::shared_ptr
:ptr ptr(&i)代码>@JohnZwinck我想petric更多的是问OP的目标是什么(为什么他想这样做)。所讨论的问题似乎是一个奇怪的问题。@petric更具体地说,Ptr结构可以有T get(){return*P;}
和set(T value){*P=value;}
等成员。这正是目前尚不支持的
struct A {
void f(int i);
double g(size_t s);
};
/* ... */
cout << describe<&A::f>::name; // Prints "f"
cout << describe<&A::g>::arity; // prints 1
template<typename T, T t> struct describe;
template<typename T t> struct describe;
/* ... */
cout << describe<&A::f>::name; // OK. T is void(A::*)(int)
cout << describe<&A::g>::arity; // OK. T is double(A::*)(size_t)
template <auto T> struct describe;