是否可以在初始化中创建模板,如:
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)而不是真实的类型名称来指定模板。 以及如何实现上述目标?
答案 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));
}
值得注意的两个变化是:
整数不是一个类型,因此如果cont被声明为template <typename T>
,那么你所写的内容将无效。 template <int N>
是参数化整数值的正确方法,如templatetypedef所述。
我不确定如何定义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");
}