Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;模板参数类型推断_C++_Templates_Type Inference_Inferred Type_C++17_C++14 - Fatal编程技术网

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 {};

我有一个C语言的模板++

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;