c++ 有没有办法通过模板函数签名作为模板模板参数

通过使用模板模板参数,可以将类模板化类传递给类,而不需要在其参数上指定类型.我想知道有没有办法传递一个模板模板参数一个函数的模板签名,以便能够专门化该函数的哪个变体被认为是前进的.

要清楚 – 我知道我不能这样做:

template <class T>
void foo() { /*...*/ }

template <template <class...> class FooType>
struct Foo { /*...*/ };

int main() {
    Foo<decltype(foo)> f;
}

但是不知何故,我希望能够将功能的模板签名传递给Foo.甚至有可能吗

最佳答案
在下面的示例中,有一个模板模板参数接受函数的首选签名.
由于专业化和缺少模板类的正文,所以只接受可调用的类型.
这是OP实际提出的一个概括:

#include<cassert>

template<typename F>
struct S;

template<typename R, typename... Args>
struct S<R(Args...)> {
    using type = R(*)(Args...);
};

template<template<typename> class F>
struct T {
    typename F<void(int)>::type ft;
    typename F<double(double, double)>::type gt;
};

void f(int) { }
double g(double x, double y) { return x+y; }

int main() {
    T<S> t;
    t.ft = f;
    t.gt = g;
    t.ft(42);
    auto v = t.gt(1., 1.);
    assert(v == 2.);
}

转载注明原文:c++ 有没有办法通过模板函数签名作为模板模板参数 - 代码日志