首页 > 解决方案 > 具体函数作为默认模板参数

问题描述

是否可以在 C++ 中设置为默认模板参数具体(免费)函数?

我的意思是这样的:

void foo() {}

template <typename F = foo>
struct C 
{
    F f;
};

标签: c++c++11templatesc++14metaprogramming

解决方案


函数指针是非类型模板参数。

template <auto F = &foo> // c++17
template <void(*F)() = &foo>

这是一个完整的例子:

#include <iostream>

void foo() { std::puts("foo"); }
void bar() { std::puts("bar"); }

template <void (*F)() = &foo>
struct Foo {
  void exec() { F(); }
};

int main() {
  Foo a;
  Foo<&bar> b;

  a.exec(); // prints "foo"
  b.exec(); // prints "bar"
}

如果您出于某种原因必须存储函数指针(就像您在代码段中所做的那样),您可以通过声明decltype(F) f = F;为类成员来实现。


推荐阅读