【问题标题】:Can class type be deduced from pointer to member function template parameter可以从指向成员函数模板参数的指针推断出类类型
【发布时间】:2017-03-16 16:56:04
【问题描述】:

是否可以从类T指向成员T::*f的指针推断出类的类型,如下所示。

struct Foo
{
    void func(){}
};

template<typename T, void (T::*f)()>
void bar()
{
}

int main()
{
    bar<Foo,Foo::func>();
    // bar<Foo::func>(); // Desired
}

【问题讨论】:

  • 你没有推导出任何东西,你明确地指定了模板参数。您可以使用 template &lt;class T&gt; void bar(void (T::*f)()){/*do something with T*/} 之类的方式推断模板参数。

标签: c++ templates pointer-to-member type-deduction template-argument-deduction


【解决方案1】:

在 C++11/14 中我会说不,除非您接受通过将指针作为函数参数传递来推断它:

template<typename T>
void bar(void(T::*f)())
{
}

int main()
{
    bar(&Foo::func);
}

在 C++17 中,您可以拥有一个如 @Jarod42 所示的单参数函数模板,但无论如何您都没有推导出 T 类型(如果这是目的,因为它似乎来自问题)。

【讨论】:

  • 我知道,但还是谢谢你。问题是Foo::func 必须是一个模板参数,我可以接受,但我想避免识别/命名T
【解决方案2】:

如果您可以访问 C++17,则可以使用auto 模板参数和decltype 来检查类类型:

struct Foo { void func(){} };

template<typename R, typename C, typename... Args>
C function_pointer_class(R (C::*)(Args...));

template<auto f>
std::enable_if_t<std::is_member_function_pointer_v<decltype(f)>>
bar() {
    using class_t = decltype(function_pointer_class(f));

    // stuff...
}

int main() {
    bar<&Foo::func>();
}

【讨论】:

  • 聪明。 +1(即使 OP 绑定到 C++03)。
  • 这个是这个问题的实际答案,因为它解决了陈述的问题(我也在寻找一个)。
【解决方案3】:

在 C++17 中,您将被允许编写

template<auto M>
void bar();

允许

bar<&Foo::func>();

【讨论】:

  • @skypjack 不完全是。我想“命名”指向成员函数的指针,而不“命名”它所属的类,因此 Jarod 的建议有效——唉,我仅限于 C++03。
  • @Olumide 没问题,我误解了这个问题。它发生了。无论如何,如果您仅限于 C++03,我怀疑您没有机会只能将其作为函数参数传递。对不起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
相关资源
最近更新 更多