问题标签 [template-meta-programming]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 帮我解决“部分专业化中未使用的模板参数”
我一直在努力使用不是 C++0x 代码,而是常规 C++。不要问我为什么必须使用常规的 C++,这只是某种愚蠢的要求。
所以事情是这样的:我需要在枚举中获得一个值为 1 或 0 的值,关于某些陈述是真还是假。因此,当然,我在枚举中模板化了一个包含 0 的结构,并使用第二条语句对其进行了专门化,其中枚举包含 1 而不是 0。
对我来说似乎很合法,但是,它告诉我应该使用专业化的参数。这有点奇怪,因为我尝试以所有可能的方式使用它,但它只是不断弹出这个错误。
这是代码:
我敢打赌,如果它不是部分专业化,那么它会起作用,但显式的不能在命名空间范围内。而且我显然不能在模板中专门化模板而不专门化它们。我可以吗 ?
c++ - 模板特化不明确
又一个模板问题!我正在尝试获取一个模板方法,如果它有运算符 << 的重载,它将输出一个对象。我几乎所有东西都在工作,并实现了一个 enable_if 以使 g++ 为每种类型的对象选择预期的专业化。
事情是,对于一个非重载的对象,它工作得很好。但是对于重载,我的两个专业都是 g++ 的合理选择,而不是编译它会输出一个模棱两可的重载错误。
这是代码:
我明白为什么这样的事情是模棱两可的。然而我想不出一种让它更明显的方法......我如何让编译器明白只有在第一个重载不能选择时才选择第二个重载?
c++ - 递归地取消隐藏基类成员
我尝试编写一个将函数元组作为其参数并operator()
为所有argument_type
函数重载的类。现在看起来像这样:
问题是基类隐藏了operator()
. 是否可以递归地取消隐藏所有定义,using
或者是模板化operator()
并选择正确重载的唯一方法boost::mpl
?
c++ - 模板函数的参数没有进行任何隐式转换
出于某种奇怪的原因,我无法将这段代码中的模板参数隐式转换为兼容类型。
失败:
因此,如果我是正确的,编译器应该会看到 main 函数中的代码如下:
((a + b) + c)
- 计算
a + b
- 使用转换运算符将
a + b
fromadd<...>
的结果转换为vec<float, 2>
add<...>
- 计算
(a + b) + c
但它从不进行隐式转换。如果我将 (a + b) 的结果显式转换为 vec,则代码可以正常工作。
c++ - 带有可变参数的 c++ 模板函数
是否可以编写一个 c++ 模板函数,该函数接受可变数量的不同类型的输入变量(输入数量可以限制为 10 个)?例如,采用一个sql_exec()
执行 sql 查询字符串并将结果行保存在所提供类型的 std 向量中的函数,即
现在我的天真的方法是(仅限于最多 2 个向量)
当然这很愚蠢,因为我没有告诉函数默认参数,我们得到
但实际上它使用 gcc 和-std=c++0x
. 但是,显然sql_query()
仍然不接受可变长度输入,需要用 2 个向量调用。另外,我希望在大多数当前编译器上都有一些可移植的东西。有什么明显的我忽略了吗?我知道我可以改变设计,也许可以使用boost::tuple
或其他东西,但我会喜欢这样一个简单的界面。
c++ - 如何确定编译器对元程序的作用?(对于 boost.proto)
如何确定我的编译器 (g++) 对模板代码做了什么?
我正在使用 boost.proto(一个表达式模板库)在编译时评估一些数学表达式。代码正确评估表达式,但我想看看编译器是否已将表达式扩展为相当于手写 c 代码(即消除了所有临时代码),或者是否还有一些进一步的编译时优化要完成。
有没有办法查看编译器对模板做了什么?
谢谢
c++ - C++ 模板:如何确定一个类型是否适合子类化
假设我有一些模板类,具体取决于 type T
。 T
几乎可以是任何东西:int
、、int*
或;它不能是,参考或任何 cv 限定的。对于一些优化,我需要知道我是否可以子类化. 所以,我需要一些 trait type ,确定为基本特征的逻辑组合或通过一些 SFINAE 技巧。pair <int, int>
struct lol
void
T
is_subclassable
在原始示例中,int
andint*
是不可子类化的,whilepair <int, int>
和struct lol
are。
编辑:正如 litb 在下面指出的那样,联合也不是可子类化的,T
也可以是联合类型。
如何编写我需要的特征类型?
c++ - 从迭代器获取 const_iterator
可能重复:
从迭代器获取 const_iterator
我想编写一个元函数,它const_iterator
从iterator
get_const_iterator<int*>::type
一定是const int*
get_const_iterator<const int*>::type
一定是const int*
get_const_iterator<int* const>::type
一定是const int*
或const int* const
,我不在乎get_const_iterator<std::list<char>::iterator>::type
一定是std::list<char>::const_iterator
等等
这可以在有iterator_traits
或没有它们的情况下完成吗?
编辑:假设如果 2 个容器具有相同的iterator
类型,那么它们也具有相同的const_iterator
类型。我认为这是一个合理的假设,尽管理论上并不完全正确。
c++ - 特化函数模板结果
我对模板元编程很陌生,在这种方法中找不到我的思维错误:
ResultTypeRowCount 实现了一个名为 ReturnType 的公共 typedef
谢谢你的阅读
c++ - 在 C++ 中获取一个类的指针,该类是另一个具有多重继承的类的一部分
我有一些相互继承的类,但它们使用模板来实现。我想要的是有效地获得一个基类的指针和/或引用,就好像它是依赖于模板的其他可能的派生类之一
派生类可以从 a1 类或 b1 类继承,这主要是为了节省派生类中的空间,因为 b1 是一个空白类,因此当派生类使用模板参数 b1 实例化时,它不会承担数据成员和虚函数的额外负载的一个。
但是,我现在想从派生(a1)中获取一个指针或引用,它实际上是派生(b1)类型的指针或引用。
我真正想要的是帮助以“好”的方式执行 offsetof(),但使用继承,我可以获得 offsetof() a2,我假设这是一个很好的衍生(b1)指针,因为 b1 是空白班。
我试图获取派生(a1)对象的指针,然后添加sizeof(a1),希望这将是正确的位置,但想知道是否有其他人有更好的建议。