给定TC#中的泛型类型,我想知道如何获取类型Q,它等于T?非可空类型T,并且T已经可以为空T.
问题来自真实的代码.我想统一访问我的ASP.NET应用程序中通过查询字符串传递的参数.我想指定相同类型的默认值,但确保null可以作为默认值传递.
public static T FetchValue<T>(
string name,
<T? for non-nullable, T otherwise> default_value = null) // How to write this?
{
var page = HttpContext.Current.Handler as Page;
string str = page.Request.QueryString[name];
if (str == null)
{
if (default_value == null)
{
throw new HttpRequestValidationException("A " + name + " must be specified.");
}
else
{
return default_value;
}
}
return (T)Convert.ChangeType(str, typeof(T));
}
Run Code Online (Sandbox Code Playgroud)
目前我被迫有两个重载FetchValue …
我在Visual Studio 2010下有一个C++项目,它编译成一个dll.我在我的项目中定义了几个私有的特定于实现的类,例如CMyClass.此类不是从dll或任何接口函数导出的.但是,当我检查生成的dll文件时,其中存储了一个字符串"CMyClass".它是一个发布版本,我不希望这个字符串出现在dll文件中.这个DLL被发送给客户,我希望我在项目中使用的所有名称都从dll文件中删除,所以没有人能够得到我们在dll中使用的算法这么简单的线索.
我使用Release配置.在项目属性中,链接器选项卡下的"生成调试信息"选项处于关闭状态,"C/C++"选项卡下的"调试信息格式"设置为"程序数据库(/ Zi)".我试图为"调试信息格式"设置空字符串,但没有成功.
在dll中找到的字符串看起来像.?AVCMyClass@@位于dll文件的最后.它是dll文件中唯一出现的"CMyClass"字符串.但是,几乎所有内部类都会显示此字符串.
如何摆脱这些提及?
更新
请注意,我不想混淆源代码本身.提供的链接无关紧要.我没有看到为什么类名存储在dll文件中的原因.我总是可以在构建之前重命名我的类,但这不是一个非常直接的解决方案.
UPDATE2
我不同意社区关闭这个问题,因为这不是重复.Tyler Gill在评论中给出了答案.感谢他并且对别人感到羞耻.
我想知道,为什么std_arr在下面的代码中声明会产生错误,同时c_arr编译得很好:
struct S { int a, b; };
S c_arr[] = {{1, 2}, {3, 4}}; // OK
std::array<S, 2> std_arr = {{1, 2}, {3, 4}}; // Error: too many initializers
Run Code Online (Sandbox Code Playgroud)
双方std::array并S都聚集.从cppreference.com上的聚合初始化:
如果initializer子句是嵌套的braced-init-list(它不是表达式且没有类型),则相应的类成员本身就是一个聚合:聚合初始化是递归的.
为什么这个初始化std::array不能编译?
我有我的(本机C++)DLL项目和基于Google Test的相应测试EXE项目.在通过此EXE调试我的DLL时,我有例外由Google Test自动处理.因此,如果我的DLL在调试期间抛出未处理的异常,我希望看到Visual Studio的错误消息,在代码导致异常后调试会话暂停.相反,我在gtest.cc中触发了断点.如果我禁用--gtest_break_on_failure旗帜,我将不会收到任何休息.
我在Google Test文档中找不到这样的选项.我错过了吗?我不想在Debug设置中为不同的异常检查"break when thrown"标志,因为我只对未处理的异常感兴趣.
c++ debugging exception-handling googletest visual-studio-2010
假设我有一个像这样的简单类层次结构:
template<class T> class TBase {};
class Param {};
class Derived : TBase<Param> {};
Run Code Online (Sandbox Code Playgroud)
这里的Derived类派生自TBase专门用于Param类的模板类.Doxygen为以下内容生成以下继承图Derived:

协作图看起来完全一样.Doxygen看到我用Paramclass来构建我的Derived课程.但是这个类没有来自类的文档页面的链接Derived!我可以点击带有TBase<T>和的矩形TBase<Param>到达TBase课堂页面,但是没有办法Param一键进入课堂.
更重要的是,我希望在协作图上看到如下内容:

现在很明显我Param用来构建Derived.有没有办法让doxygen生成这样的图表?或者有没有办法至少使<Param>箭头的标题可点击?
PS.我使用了以下doxygen设置:
HAVE_DOT = YES
TEMPLATE_RELATIONS = YES
HIDE_UNDOC_CLASSES = NO
CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES
Run Code Online (Sandbox Code Playgroud) 我想创建一个由一些已知函数填充的2D数组,没有运行时开销.
有一个例子,假设一个功能f(x, y) = 10 * y + x,让x在{1, 2, 3}和y中{4, 5, 6}.我想创建一个包含内容的2D数组
41 42 43
51 52 53
61 62 63
Run Code Online (Sandbox Code Playgroud)
现在,最简单的方法就是直接在我的源代码中对值进行硬编码.这确实适合我的任务,所以问题只是出于好奇.
我想创建一个metafunc和结构具有某种魔法,这让我定义数组出给定值的集合的拥有x和y.像这样:
template<int X> struct Func {
template<int Y> struct over {
static const int value = 10 * Y + X; // f(x, y)
};
};
template<int... args1> struct Rows {
template<int... args2> struct Cols {
static const int data[sizeof...(args1)][sizeof...(args2)];
}; …Run Code Online (Sandbox Code Playgroud) 这可能是一个愚蠢的问题,但我感到困惑。我有一种感觉,立即(consteval)函数具有在编译时被执行,我们根本无法看到它的身体在二进制。
这篇文章显然支持我的感觉:
这意味着[immediate]函数仅在编译时可见。该函数不会发出符号,您不能使用该函数的地址,并且调试器之类的工具将无法显示它们。在这种情况下,立即函数类似于宏。
在Herb Sutter的出版物中也可以找到类似的强烈主张:
请注意,C ++ 20草案已经包含了第一轮与反射相关的工作,并纳入了标准:确保函数在编译时运行的 consteval函数,这些函数来自于反射工作,并且专门用于处理反射信息。
但是,有很多证据对此事实不太清楚。
来自cppreference:
consteval-指定一个函数为立即函数,也就是说,对该函数的每次调用都必须产生一个编译时常量。
这并不意味着它已经在只有编译时被调用。
现在,人们普遍同意,将来对反射的语言支持应该使用constexpr函数,但是由于“反射函数”通常必须在编译时进行评估,因此实际上它们很可能是立即函数。
似乎这意味着我的想法,但仍未明确说出。根据同一建议:
但是,有时我们想表达的是,函数在被调用时(直接或间接)应始终产生常数,而非常数结果应产生错误。
同样,这并不意味着仅在编译时就必须评估函数。
从这个答案:
您的代码必须产生一个编译时常数表达式。但是编译时常量表达式在您使用它的上下文中不是可观察的属性,并且在链接甚至运行时执行它都没有副作用!在没有任何阻止的情况下
最后,有一个实时演示,其中consteval在运行时明确调用了函数。但是,我希望这是由于constevalclang尚未正确支持该事实,并且该行为实际上是不正确的,就像为什么consteval函数允许未定义的行为?
更准确地说,我想听听被引用文章的以下哪些陈述是正确的:
声明全局常量可能很方便,但在 C++ 中并不容易。例如,请参阅Fluent C++ 最近的这篇文章。它主要解释了如何做到这一点,但没有提及 C++20 模块。
在命名空间级别的常规头文件中,我将声明一个如下常量:
// Constants.h
inline constexpr int Count = 42;
inline const std::vector<int> Numbers = { 1, 2, 3 }; // cannot use constexpr
Run Code Online (Sandbox Code Playgroud)
这里我需要inline,因为这些符号可能包含在多个翻译单元中。IIUC,导出符号的模块定义单元,是一个单独的翻译单元。所以我简单地声明如下:
// Constants.ixx
export module constants;
export constexpr int Count = 42;
export const std::vector<int> Numbers = { 1, 2, 3 }; // cannot use constexpr
Run Code Online (Sandbox Code Playgroud)
这是正确的做法,还是我错过了什么?
正如指出的使用的std ::的unique_ptr的一个std :: unordered_set,这是不容易找到一个指针T*中std::unordered_set<std::unique_ptr<T>>。在 C++20 之前,我们被迫构造一个std::unique_ptr<T>.
感谢无序容器提案的异构查找(http://wg21.link/P0919r3和http://wg21.link/p1690r1),这个问题在 C++20 中得到解决。但是可用的解决方案对我来说看起来很笨拙(即使按照 C++ 标准)。似乎我需要从头开始实现不是一个,而是两个函子(用于透明散列和透明比较):
template<class T>
struct Equal {
using is_transparent = void;
bool operator()(const std::unique_ptr<T>& lhs, const std::unique_ptr<T>& rhs) const {
return lhs == rhs;
}
bool operator()(const std::unique_ptr<T>& lhs, const T* rhs) const {
return lhs.get() == rhs;
}
bool operator()(const T* lhs, const std::unique_ptr<T>& rhs) const {
return lhs == rhs.get();
}
};
template<class …Run Code Online (Sandbox Code Playgroud) 在这篇文章中,我偶然发现了这段晦涩的代码(随意呈现,就像这是一个完全正常的 C++ 代码):
struct Tree : std::vector<Tree> {};
Run Code Online (Sandbox Code Playgroud)
然后创建并比较两棵树(参见演示):
Tree tree(size_t h)
{
Tree s;
if (h > 0)
s.insert(s.end(), 2, tree(h - 1));
return s;
}
int main()
{
size_t h = 15;
Tree s1 = tree(h);
Tree s2 = tree(h);
clock_t t = clock();
s1 < s2;
double d = clock() - t;
d /= CLOCKS_PER_SEC;
std::cout << d << std::endl; // 4.1s
}
Run Code Online (Sandbox Code Playgroud)
经过一番思考,我意识到这种比较似乎是合法的,并且总是会产生错误。
本文的想法是,由于C ++矢量与17个工具比较std::lexicographical_compare,其对应元素进行比较a,并b在两个序列既是a<b …
c++ ×9
c++20 ×4
arrays ×2
c# ×1
c++-modules ×1
c++11 ×1
c++14 ×1
comparison ×1
consteval ×1
crtp ×1
debugging ×1
dll ×1
doxygen ×1
generics ×1
googletest ×1
inheritance ×1
linker ×1
nullable ×1
obfuscation ×1
templates ×1
type-traits ×1
unique-ptr ×1