<>I使用C++并计划一个具有大约100个模板参数的类的库。当然,我担心有n个模板参数,如果用户需要每次组合,我们就会有2^n个不同的类,这是一种代码爆炸。但是,用户需要执行2^n的实例化操作。
我的问题是:这么多模板参数的主要技术问题是什么?
备注:
就技术而言,我对有关可读性、设计等的主观答案不感兴趣。我指的是像这样的事实。
运行时
代码大小
允许的最大模板数
代码示例:
// here we have 2, but I have 100 template parameters
template<typename T1, typename
在“2.4 Overloading Function Templates模板-完整指南”一书的C++部分,您可以找到以下示例:
// maximum of two int values
inline int const& max (int const& a, int const& b)
{
return a < b ? b : a;
}
// maximum of two values of any type
template <typename T>
inline T const& max (T const& a, T con
我知道在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();
};
在这整个介绍之后,让我们讲到重点。
我的问题是:
using FuncDef = void(int a, int b);
template <typename R, typename... Args>
class WrongFunction {
public:
void F1(R(*Fn)(Args...)) {}//error: C2091 function returns function
};
template <typename T> class Function;
template <typename R, typename... Args>
class Function<R(A
如果我创建了一个指向基成员的指针,我通常可以将它转换为指向派生成员的指针,但当在下面的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
我正在尝试编写一个yacc (menhir)语法,用于解析一个非常简化的C++子集(没有模板,标头只允许任何函数体.)而且已经遇到了模棱两可的问题。
typedef int B;
class A {
A(); // (*)
B(c)(); // (**)
};
Case *是构造函数,case **是括号大小的声明符。解析器是如何区分的?我可以想象一些我可以知道的方法,但是我想知道兼容的c++解析器是如何做到的。我也明白,我很可能无法用yacc解析C++的一个实际子集,但我只想更好地了解正在发生的事情。最后,我可能会切换到解析器、组合器或其他东西。此外,我应该指出,我对
首先,请随意为这个问题建议更好的标题。
考虑下列方案:
#include <numeric>
namespace N { class C {}; }
int operator+( int i, N::C ) { return i+1; }
int main() {
N::C a[10];
std::accumulate( a, a+10, 0 );
}
g++ 5.4.0:成功编译(参见实时演示 )
clang++ 3.8.0 (参见实时演示 )
错误:
In file included from source_file.cpp:3:
/usr/include
我想知道这个代码是否合法(当然是在C++17中):
template<typename T = int>
class C {};
int main() {
C c;
}
这在GCC 8.1.0中编译得很好,但Clang 6.0.0却失败了。我试图在“标准”中找到答案,但我不是语言律师,我也想不出答案。另一方面,声明如下:
std::less l; // same as std::less<void> l;
那么,是否可以定义一个对象,其类型是一个模板类,其中所有模板参数都有默认值,而不使用角括号。
编辑
我试图澄清我的疑问:我的代码,只
我需要你的帮助
if(s[i]==t)
{
//I get error for this
//aSP[pos] = min( (dfs(i)+pow(i-pos,2)) , aSP[pos] );
//Then I replace the above code with the following codes, and then it worked
int a = (dfs(i)+pow(i-pos,2));
int b = aSP[pos];
aSP[pos] = min(a,b);
}
但是他们是相同的,对吗?为什么
每个C++类都可以在其他类型中声明转换运算符,特别是运算符可以是模板,并且可以转换为常量引用类型。但是看起来现代编译器对这个操作符的处理方式是不同的。下一个示例:
struct B {};
struct A {
template <typename T> operator const T &();
operator B() = delete;
};
int main() {
A a;
[[maybe_unused]] B b(a); //error in Clang
[[maybe_unused]] int c(a); //err
我目前正在为CLI/C++中的原生C++类编写一个包装器。我现在正在上一个小GamePacket课。请考虑以下课程:
public ref class GamePacket
{
public:
GamePacket();
~GamePacket();
generic<typename T>
where T : System::ValueType
void Write(T value)
{
this->bw->Write(value);
}
};
我希望能够在C#中使用包装器调用函数,如下所示:
P