函数模板作为类模板的参数

时间:2010-10-28 19:21:00

标签: c++ templates

<> - 将此作为模板阅读;

我可以这样做:

void f() {}

//Here I'm declaring a fnc as a <> param
template<void (*fnc)()>
struct Factor { };

int main()
{
  Factor<f> fac;
  return 0;
}

但我不能这样做:

#include <sstream>

template<class R, class T>
R make_(T first, T second)
{
    std::stringstream interpreter;
    R result = R();
    interpreter << first << '.' << second;
    interpreter >> result;
    return result;
}

//Here I'm (trying) to declare fnc <> as a <> param
template<template<class T,class R> R (*fnc)(T,T)>
struct Factor { };

int main(int argc, char* argv[])
{
  Factor<make_> fac;
  return 0;
}

BIG Q是:如何(如果可能)我可以将模板参数声明为fnc模板?

修改

假设我使用了Armen的建议: 我希望能够做到这样的事情(主要):

Factor<f<"1","02">> m;

然后在m我可以用那些args(“1”,“02”)制作双重类型

3 个答案:

答案 0 :(得分:1)

在C ++中没有这种语法。 你应该做的不是函数模板使用函子模板,它适合作为模板模板参数。

E.G。

template <class R, class T>
struct f
{
    R operator () (T const&)
    {
        //blah
    }
};

template <template<class R, class T> class F >
struct foo
{
    ///...
};

int main()
{
    foo<f> d;
}

答案 1 :(得分:1)

您的语法有一些问题。最后您使用Factor<make_> fac;执行的操作类似于声明vector<map> v;您需要为模板提供参数以使其具体:Factor<make_<int,int> > fac;。但这不是整个问题;有很多。

你正在做的功能不太对劲。您正在提供特定功能(第一个示例中的f),可以作为构造函数参数完成。你应该重新评估你的设计。

答案 2 :(得分:0)

通过查看您的make_()功能模板,您实际想要的似乎是boost::lexical_cast<>()。它完成了make_()所做的事情,只做得更好。 (对于初学者,您的转换根本不会检查错误。)