typedef 模板,接受指向 const 和非 const 函数的指针
Posted
技术标签:
【中文标题】typedef 模板,接受指向 const 和非 const 函数的指针【英文标题】:template for typedef that accepts pointer to both const and non-const functions 【发布时间】:2017-10-19 08:23:07 【问题描述】:这是一个类方法的指针,它接受两个整数并返回一个整数:
template <typename T>
using TFunction = int (T::*)(int, int);
我只能在这里传递非常量方法。 如何更改此模板以使其同时接受 const 和非 const 方法?
【问题讨论】:
你的意思是 eitherconst
和非const
函数,对吧?没有单一的指针类型可以同时做到这两点。
我不接受任何会员。它接受T
。你的minimal reproducible example 太少了。这是一个 XY 问题。
您不能有一个同时引用两种类型的名称。您可以使用template <typename T> using TCFunction = int (T::*const)(int, int);
为const
函数命名,或者使用std::function
或您自己的版本键入擦除函数指针。
【参考方案1】:
这种情况对于一个条件来说很简单:
template <typename T>
using TFunction = std::conditional_t<
std::is_const_v<T>,
int (T::*)(int, int) const,
int (T::*)(int, int)
>;
现在TFunction<Foo>
是int (Foo::*)(int, int)
,而TFunction<Foo const>
是int (Foo::*)(int, int) const
。
【讨论】:
但是具有常量成员函数的非 const Foo 类型呢? @Jodocus 这是一个红鲱鱼:我将“const
-or-non-const
”参数搭载到T
,而不是让它成为一个单独的bool
.它与您稍后将使用的实际Foo
的const
ness 无关,您仍然可以将TFunction<Foo const>
调用到Foo
上:)
删除了我原来的评论,因为这太棒了。尽管一般T
必须是一个id 表达式(因此一般不能是const T
),模板上下文允许同时使用类型信息,和保留指向格式良好的成员的指针。以上是关于typedef 模板,接受指向 const 和非 const 函数的指针的主要内容,如果未能解决你的问题,请参考以下文章