具体的语法问题

时间:2011-01-11 22:28:32

标签: c++ templates metaprogramming


是否可以在初始化中创建模板,如:

template <typename C> typename C::value_type  fooFunction(C& c) {...};
std::vector<string> vec_instance;
fooFunction(cont<0>(vec_instance));
fooFunction(cont<1>(vec_instance));

一般来说,我感兴趣的是可以使用整数(即.0)而不是真实的类型名称来指定模板。 以及如何实现上述目标?

3 个答案:

答案 0 :(得分:1)

我不清楚你在问什么,但以下代码段对我有用:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

template <typename C>
typename C::value_type  fooFunction(const C & c) { return 0; };
/* note that fooFunction takes a ref-to-const, not a reference  */ 

template<int N>
struct cont
{
public:
   typedef int value_type;
   cont(vector<string> vec) {};
};

int main()
{
std::vector<string> vec_instance;
fooFunction(cont<0>(vec_instance));
fooFunction(cont<1>(vec_instance));
}

值得注意的两个变化是:

  1. 整数不是一个类型,因此如果cont被声明为template <typename T>,那么你所写的内容将无效。 template <int N>是参数化整数值的正确方法,如templatetypedef所述。

  2. 我不确定如何定义cont<>,但根据您的用法,它必须是您正在构建的临时对象。您将无法将此临时文件作为参考传递到fooFunction。请注意,上面的示例将C作为reference-to-const传递。

答案 1 :(得分:0)

是的,您可以通过非类型参数(如整数,指针和其他模板)参数化模板。例如:

template <typename T, int N> struct Array {
    T data[N];

    /* ... other functions ... */
};

这些模板的工作方式与您看到的所有其他模板一样,只是它们是通过整数值而不是类型进行参数化。

This link有关于此主题的更多信息。 “现代C ++设计”和“C ++模板:完整指南”也有很多关于如何做到这一点的信息。

答案 2 :(得分:0)

这就是你追求的吗?非类型模板参数:

template<int n> class Cont
{
public:
    typedef int value_type;
};

template<>
class Cont<0>
{
public:
        typedef double value_type;
        value_type convert(const std::string& s) const
        {
            return atof(s.c_str());
        }
};

template<>
class Cont<1>
{
public:
        typedef long value_type;
        value_type convert(const std::string& s) const
        {
            return atoi(s.c_str());
        }
};

template <int n> typename Cont<n>::value_type  fooFunction(const Cont<n>& cont, const std::string& s)
{
    return cont.convert(s);
}
void test()
{
    Cont<0> c0;
    Cont<1> c1;
    double d = fooFunction(c0,"1.0");
    int i = fooFunction(c1, "-17");
}