我知道在C++中,泛型实际上并不存在,但是您可以使用template来模拟它。当您构建代码时,编译器会对代码进行预处理,并生成一个新代码,替换为对象声明中指定的实际值的泛型值,然后是真正编译的新代码。例如,假设类A如下所示:
template<class T>
class A
{
T f();
};
然后在代码中的其他地方,我们有A<int> a;。实际编译的代码是:
class A
{
//Replaces T by int in the pre-processing
int f();
};
在这整个介绍之后,让我们讲到重点。
我的问题是:
可能重复:
为什么第一个声明是可以的,而第二个声明不是?为什么std::string不合适?
template <typename T, T x> struct foo { };
using namespace std;
int main()
{
foo<int, 0> f_int; // ok
foo<string, ""> f_string; // not ok
}
我得到:
error: a non-type template parameter cannot have
我试着做这个模板实例化,但它不起作用。我发现了错误:
prog.cpp:7:15: error: template-id 'f<const A&, A()>' for 'void f()' does not match any template declaration
template <class T, T> void f() {}
struct A {};
template void f<const A &, A()>();
int main() {}
这很奇怪,因为当我主要做这件事时,它会起
如果我创建了一个指向基成员的指针,我通常可以将它转换为指向派生成员的指针,但当在下面的Buzz这样的模板中使用时就不能了,因为第一个模板参数会影响第二个模板参数。我是在与编译器bug作斗争,还是标准真的要求这样做不起作用?
struct Foo
{
int x;
};
struct Bar : public Foo
{
};
template<class T, int T::* z>
struct Buzz
{
};
static int Bar::* const workaround = &Foo::x;
int main()
{
// This
如何在c++中获取某个类型的“嵌套”模板参数的数量? 我想写一个返回T的模板参数数量的函数GetNumberOfTypes<T>() constexpr int a = GetNumberOfTypes<int>(); //a == 0
constexpr int b = GetNumberOfTypes<std::vector<int>>(); //b == 1
constexpr int c = GetNumberOfTypes<std::tuple<int,int>>(); //c == 2 这能以某种方式实现吗?
代码:
#include <memory>
struct Data;
std::unique_ptr<Data> make_me();
int main()
{
std::unique_ptr<Data> m = make_me();
return 0;
}
当然哪一个失败了:
In file included from <source>:1:
In file included from /opt/compiler-explorer/gcc-7.1.0/lib/gcc/x86_64-linux-gnu/7.1.0/../../
这是从编译器内部角度提出的问题。
我对泛型感兴趣,而不是模板(C++),所以我用C#标记了这个问题。而不是Java,因为AFAIK两种语言中的泛型在实现上有所不同。
当我查看语言w/o泛型时,它非常简单,您可以验证类定义,将其添加到层次结构中,仅此而已。
但是如何处理泛型类,更重要的是如何处理对它的引用呢?如何确保每个实例化的静态字段都是单数(即每次解决泛型参数时)。
假设我看到一个电话:
var x = new Foo<Bar>();
我是否向层次结构中添加了新的Foo_Bar类?
更新:到目前为止,我只发现了两篇相关的文章,然而,即使它们在“如何自己做”的意义上也没有太多的细节
下面的片段在Clang4.0中没有错误,但是GCC 7.0生成了 (注意-std=c++1z标志的使用)。
using FuncT = int (*)(double);
template <FuncT FUNC>
int temp_foo(double a)
{
return FUNC(a);
}
int foo(double a)
{
return 42;
}
void func()
{
auto lambda = [](double a) { return 5; };
struct MyStruct
{
stati
据我所知,模板值需要在编译时知道。所以我写了一个小例子,看看我得到了它,但很明显我没有。所以我得到了这个:
`defValue' cannot appear in a constant-
expression
谁能告诉我这个问题是什么,以及如何解决它?
#include <iostream>
template <class T,T defaultVal, int dim=255>
class Vec
{
T _vec[dim];
int _dim;
public:
Vec () : _dim(dim)
{
我的编译器是gcc 4.9.0。无法编译下列代码:
template<typename T, T i>
struct value {};
template<typename T>
struct value<T, 0> {};
// error: type 'T' of template argument '0' depends on a template parameter
原因是什么?那么,如何解决这个问题呢?
给定一个C++类:
template<typename T>
class A {
public:
int a;
T x;
int getA() {return a;}
};
模板专门化是否可以“继承”(没有实际的C++继承)成员,比如A和getA()?此外,在为类编写大量模板专门化的代码时,我是否应该多次键入相同的代码(这有点违背了模板的全部用途),还是对类进行结构调整,使其能够适应专门化(例如,将另一个模板类成员封装在其中,使专门化仅限于该类)?
考虑以下C++程序:
#include <iostream>
using namespace std;
template<typename T>
class example
{
public:
void function (T a)
{
std::cout<<a.size ();
}
};
int main() {
example<string> a; // this doesn't
string b = "a";
//example<int
我注意到,与C++不同的是,在C#中,您可以组合使用虚拟方法和泛型方法。例如:
using System.Diagnostics;
class Base {
public virtual void Concrete() {Debug.WriteLine("base concrete");}
public virtual void Generic<T>() {Debug.WriteLine("base generic");}
}
class Derived : Base {
public override void Conc