Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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++ 推导typedef函数指针的模板参数_C++_Templates_Function Pointers_Typedef - Fatal编程技术网

C++ 推导typedef函数指针的模板参数

C++ 推导typedef函数指针的模板参数,c++,templates,function-pointers,typedef,C++,Templates,Function Pointers,Typedef,在使用typedef时,是否有方法推断函数指针的模板参数?我的示例代码是: struct A {}; void func(const A&) {}; template <typename T> struct FuncPtr { typedef void(*Type)(const T&); }; void f_(FuncPtr<A>::Type) {} template <typename T> // I'd like to hid

在使用typedef时,是否有方法推断函数指针的模板参数?我的示例代码是:

struct A {};
void func(const A&) {};

template <typename T>
struct FuncPtr
{
    typedef void(*Type)(const T&);
};

void f_(FuncPtr<A>::Type) {}

template <typename T> // I'd like to hide the messy function pointer in a typedef
void f1(typename FuncPtr<T>::Type fp) { f_(fp); }

template <typename T> // this works, but "fp" is really several lines long
void f2(void(*fp)(const T&)) { f_(fp); }

有了它,我可以打电话给f2AFunc。但我更希望使用更接近f1func的函数,因为在我的实际代码中,函数指针的声明要长得多。我需要有一个实际的函数指针,而不仅仅是传递一个模板参数,这样我就可以调用f_.

而不是使用当前设置。::*左边的所有内容都是非推断上下文,因为元函数可以对类型应用任意图灵完全变换,并且在任何情况下,都不能保证原始类型和结果之间的一对一映射。所以这种语言甚至没有尝试过

但是别名模板可以工作:

template <class T>
using FuncPtr = void (*)(const T&);

template <typename T>
void f3(FuncPtr<T> fp) { return f_(fp); }

*正式名称为嵌套名称说明符,该类型是使用限定id[temp.decredit.type]/p5指定的。

不适用于当前设置。::*左边的所有内容都是非推断上下文,因为元函数可以对类型应用任意图灵完全变换,并且在任何情况下,都不能保证原始类型和结果之间的一对一映射。所以这种语言甚至没有尝试过

但是别名模板可以工作:

template <class T>
using FuncPtr = void (*)(const T&);

template <typename T>
void f3(FuncPtr<T> fp) { return f_(fp); }

正式称为嵌套名称说明符,它是使用一个合格的id [TEMP.Time.Type ] /P5.< /P> < P>作为“有效的现代C++”项目9,喜欢别名声明到Type的声明: 特别是,在这种情况下,别名声明可以模板化 它们被称为别名模板,而typedefs不能。这给 C++11程序员提供了一种简单的表达机制 在C++98中,必须使用嵌套在其中的typedef进行黑客攻击 模板化结构。例如,考虑定义使用自定义分配器MyAlloc的链表的同义词。有了alias模板,这就很容易了:

使用typedef,您几乎必须从 划痕:


作为“有效的现代C++”项目9,喜欢别名声明到Type Debug: 特别是,在这种情况下,别名声明可以模板化 它们被称为别名模板,而typedefs不能。这给 C++11程序员提供了一种简单的表达机制 在C++98中,必须使用嵌套在其中的typedef进行黑客攻击 模板化结构。例如,考虑定义使用自定义分配器MyAlloc的链表的同义词。有了alias模板,这就很容易了:

使用typedef,您几乎必须从 划痕:

template<typename T> 
struct MyAllocList { 
 typedef std::list<T, MyAlloc<T>> type; 
}; 
MyAllocList<Widget>::type lw;