- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我开发了一个通用的“未签名”类,或者实际上是一个类模板 Unsigned<size_t N>
它使用 uint8_t
的数量在 C (C++) 内置无符号数之后建模s 作为参数。例如Unsigned<4>
与 uint32_t
相同和 Unsigned<32>
将与 uint256_t
相同-- 如果它存在。
到目前为止,我已经设法遵循了大部分(如果不是全部的话)来自内置无符号符号的预期语义——特别是 sizeof(Natural<N>)==N
。 , (Natural<N>(-1) == "max_value_all_bits_1" == ~Natural<N>(0))
,与 abs()、sign()、div(使用自定义 div_t 结构)、ilogb()(似乎是 GCC 独有的)和 numeric_limits<> 的兼容性。
但是我面临的问题是,因为 1.- 类模板只是一个模板,所以模板化形式是不相关的,并且 2.- 模板非类型化参数需要一个“编译时常量”,它是比“a const
”更严格,我基本上无法在给定未知 N 的情况下创建 Unsigned。
换句话说,我不能有这样的代码:
...
( ... assuming all adequate headers are included ...)
using namespace std;
using lpp::Unsigned;
std::string str;
cout<< "Enter an arbitrarily long integer (end it with <ENTER>) :>";
getline(cin, str, '\n');
const int digits10 = log10(str.length()) + 1;
const int digits256 = (digits10 + 1) * ceil(log(10)/log(256)); // from "10×10^D = 256^T"
// at this point, I "should" be able to, semantically, do this:
Unsigned<digits256> num; // <-- THIS I CAN'T -- num would be guaranteed
// big enough to hold str's binary expression,
// no more space is needed
Unsigned::from_str(num, str); // somehow converts (essentially a base change algo)
// now I could do whatever I wanted with num "as if" a builtin.
std::string str_b3 = change_base(num, 3); // a generic implemented somehow
cout<< "The number above, in base 3, is: "<< str_b3<< endl;
...
(A/N——这是 Unsigned 测试套件的一部分,它读取一个“稍大的数字”(我已经尝试了最多 120 位数字——在相应地设置 N 之后)并且做一些事情,比如在其他基础上表达它,它本身已经测试了所有算术函数。)
在寻找绕过或以其他方式减轻此限制的可能方法时,我遇到了一些我想尝试和探索的概念,但我不想花太多精力在替代方案上会使事情变得更复杂,或者会使类的行为偏离太多。
我首先想到的是,如果我无法拿起 Unsigned<N>
根据我的选择,我至少可以从一组预选的 N 值中选取,这将导致在运行时调用足够的构造函数,但取决于编译时值:
???? GetMeAnUnsigned (size_t S) {
switch (S) {
case 0: { throw something(); } // we can't have a zero-size number, right?
case 1, 2, 3, 4: { return Unsigned<4>(); break; }
case 5, 6, 7, 8: { return Unsigned<8>(); break; }
case 9, 10, 11, 12, 13, 14, 15, 16: { return Unsigned<16>(); break; }
....
default: { return Unsigned<128>(); break; } // wow, a 1Kib number!
} // end switch
exit(1); // this point *shouldn't* be reachable!
} // end function
我个人喜欢这种方法。但是我不知道我可以用什么来指定返回类型。它实际上并没有“解决”问题,只是在一定程度上降低了问题的严重性。我敢肯定,使用 switch 的技巧是可行的,因为实例化是来自编译时常量,它只会更改 哪些 将发生。
声明返回类型的唯一可行帮助似乎是这个新的 C++0(1?)X "decltype"构造,它允许我获得足够的类型,比如,如果我正确理解了该功能:
decltype (Unsigned<N>) GetMeAnUnsigned (size_t S) {
.. do some choices that originate an N
return Unsigned<N>();
}
... 或类似的东西。我还没有进入 C++?X beyond auto
(对于迭代器)还没有,所以第一个问题是:会像 decltype
这样的功能吗?或 auto
帮助我实现我想要的?(运行时实例化的选择,即使有限)
作为替代方案,我在想,如果问题出在我的类之间的关系上,那么我可以通过派生模板本身使它们全部成为“某种”基础:
template <size_t N>
class Unsigned : private UnsignedCommon { ...
...但我将这种方法搁置一旁,因为,好吧,人们不会那个(使所有的东西都成为“一种”)内置插件,加上案例如果我没记错的话,确实实际上将它们视为一个公共(public)类,它需要初始化静态、返回指针并让客户端自行销毁。那么第二个问题:我过早放弃这个替代方案是不是做错了?
最佳答案
简而言之,您的问题与内置整数类型的问题没有什么不同。给出 short
,您不能在其中存储大整数。你不能在运行时决定使用哪种类型的整数,除非你使用 switch
或类似于在几个预定义选项之间进行选择(例如,short
、int
、long
、long long
。或者在您的情况下,Unsigned<4>
、Unsigned<8>
、Unsigned<256>
。无法计算大小在运行时动态地以任何方式。
您必须定义动态大小的类型(类似于 std::vector
),其中大小不是模板参数,以便单个类型可以存储任何 整数类型(然后接受暗示的效率损失),或者接受必须在编译时选择大小,并且处理“任意”整数的唯一选择是硬编码一组预定义的大小和在运行时在它们之间进行选择。
decltype
也不会解决你的问题。它与 auto
非常相似,它完全在编译时工作,并且只返回表达式的类型。 (2+2
的类型是 int
,编译器在编译时知道这一点,即使值 4
仅在运行时计算)
关于c++ - 模板:在运行时从(并引用)非类型参数实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3453751/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: template pass by value or const reference or…? 以下对于将函数
我用相同的参数列表重载了一个运算符两次。但返回类型不同: T& operator()(par_list){blablabla} const T& operator()(par_list){bla
假设我有实现接口(interface) I 的 Activity A。我的 ViewModel 类 (VM) 持有对实现接口(interface) I 的对象的引用: class A extends
PHP 如何解释 &$this ?为什么允许? 我遇到了以下问题,这看起来像是 PHP 7.1 和 7.2 中的错误。它与 &$this 引用和跨命名空间调用以及 call_user_func_arr
谁能解释一下下面“&”的作用: class TEST { } $abc =& new TEST(); 我知道这是引用。但是有人可以说明我为什么以及什么时候需要这样的东西吗?或者给我指向一个对此有很好解
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。 C++ 引用 vs 指针 引用很容易与指针混淆,它们之间有三
目录 引言 背景 结论 引言 我选择写C++中的引用是因为我感觉大多数人误解了引用。而我之所以有这个感受是因为我主持过很多C++的面试,并且我很少
Perl 中的引用是指一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至函数,可以应用在程序的任何地方 创建引用 定义变量的时候,在变量名前面加个 \,就得到了这个变量的一个引用 $sc
我编写了一个将从主脚本加载的 Perl 模块。该模块使用在主脚本中定义的子程序(我不是维护者)。 对于主脚本中的一个子例程,需要扩展,但我不想修补主脚本。相反,我想覆盖我的模块中的函数并保存对原始子例
我花了几个小时试图掌握 F# Quotations,但我遇到了一些障碍。我的要求是从可区分的联合类型中取出简单的函数(只是整数、+、-、/、*)并生成一个表达式树,最终将用于生成 C 代码。我知道使用
很多时候,问题(尤其是那些标记为 regex 的问题)询问验证密码的方法。似乎用户通常会寻求密码验证方法,包括确保密码包含特定字符、匹配特定模式和/或遵守最少字符数。这篇文章旨在帮助用户找到合适的密码
我想通过 MIN 函数内的地址(例如,C800)引用包含文本的最后一个单元格。你能帮忙吗? Sub Set_Formula() ' ----------------------------- Dim
使用常规的 for 循环,我可以做类似的事情: for (let i = 0; i < objects.length; i++) { delete objects[i]; } 常规的 for-
在 Cucumber 中,您定义了定义 BDD 语法的步骤;例如,您的测试可能有: When I navigate to step 3 然后你可以定义一个步骤: When /^I navigate t
这是什么UnaryExpression的目的,以及应该怎样使用? 最佳答案 它需要一个 Expression对象并用另一个 Expression 包裹它.例如,如果您有一个用于 lambda 的表达式
给出以下内容 $("#identifier div:first, #idetifier2").fadeOut(300,function() { // I need to reference jus
我不知道我要找的东西的正确术语,但我要找的是一个完整的引用,可以放在双引号之间的语句,比如 *, node()、@* 以及所有列出的 here加上任何其他存在的。 我链接到的答案提供了一些细节,但还
This question's answers are a community effort。编辑现有答案以改善此职位。它当前不接受新的答案或互动。 这是什么? 这是常见问答的集合。这也是一个社区Wi
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
考虑下一个代码: fn get_ref(slice: &'a Vec, f: fn(&'a Vec) -> R) -> R where R: 'a, { f(slice) } fn m
我是一名优秀的程序员,十分优秀!