小编qua*_*ant的帖子

如何将模板类限制为某些内置类型?

这个问题已经讨论了几次,但我发现的所有解决方案要么不起作用,要么基于boost的静态断言.我的问题很简单.我有一个类,我只想允许真正的类型(double和float).如果我尝试使用float或double以外的类型实例化类,我想要一个编译时错误.我正在使用Visual C++ 11.这是我尝试过的:

template <typename RealType>
class A
{
  // Warning C4346
  static_assert(std::is_same<RealType, double>::value || std::is_same<RealType, float>::value);
}


template <typename RealType>
class A
{
  // Error C2062: type 'unknown' unexpected
  static_assert(decltype(RealType) == double || decltype(RealType) == float);
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?提前致谢!

c++ templates static-assert c++11 visual-studio-2012

24
推荐指数
3
解决办法
2万
查看次数

如果我不接受投掷怎么办?

这是超级基础但我无法在任何地方找到答案.有很多帖子在那里大约抛出和捕获,但实际发生的事情,如果我throwfunction1,然后调用function1function2,但不抓住它,这是否意味着它只是被重新抛出来的来电function2?从以下情况来看,我会说是的,但是在我开始并假设之前,我希望得到一个坚实的大师般的答案:

#include <iostream>

void function1()
{
    throw 1;
}

void function2()
{
    function1();
}

int main()
{
    try
    {
        function2();
    }
    catch(...)
    {
        std::cout << "caught!";
        return 0;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Output: caught!

c++

20
推荐指数
4
解决办法
2万
查看次数

如何将valgrind测试添加到我的cmake"test"目标中

我通过构建,ninja然后ninja test从我的构建树运行来运行单元测试:

cmake -G Ninja /source/tree
ninja
ninja test
Run Code Online (Sandbox Code Playgroud)

但是,要运行valgrind,我需要手动运行它:

valgrind rel/path/to/test
Run Code Online (Sandbox Code Playgroud)

我想valgrind在跑步时自动跑步ninja test.根据cmake文档 "设置[valgrind测试] 非常容易 ",但是当我运行时

ctest -D NightlyMemoryCheck
Run Code Online (Sandbox Code Playgroud)

我刚收到这个错误:

Cannot find file: /home/arman/tinman/deb/DartConfiguration.tcl
   Site: 
   Build name: (empty)
WARNING: No nightly start time found please set in CTestConfig.cmake or DartConfig.cmake
Problem initializing the dashboard.
Run Code Online (Sandbox Code Playgroud)

当我遵循此SO问题的说明时,我收到类似的错误:

如何让ctest用valgrind运行一个没有dart的程序?

我不知道是什么dart,但根据网站它是某种在线测试doodad.

对我来说,显然非常容易.有谁知道一个解决方案,使超级容易,你就必须是某种IT术士,使它的不是工作?

c++ valgrind cmake

20
推荐指数
1
解决办法
8026
查看次数

什么比std :: pow更快?

我的程序在该std::pow(double,int)函数中花费了90%的CPU时间.准确性不是这里的主要关注点,所以我想知道是否有更快的替代品.我想要尝试的一件事是铸造浮动,执行操作然后再加倍(尚未尝试过); 我担心这不是一种提高性能的可移植方式(不管大多数CPU本质上都是双重操作吗?)

干杯

c++ performance

18
推荐指数
3
解决办法
2万
查看次数

如何让vim包含三次斜杠注释?

我经常gq用来将更长的注释包装在一些字符内,如果我正在使用///* /*评论我的代码,它可以正常工作:

// here is a simple comment that exceeds my line width 
// across multiple lines

// here is a simple comment that
// exceeds my line width across
// multiple lines
Run Code Online (Sandbox Code Playgroud)

但是,如果我有三次斜杠评论,例如对于doxygen,它不起作用:

/// here is a simple comment that exceeds my line width
/// across multiple lines

/// here is a simple comment that
// exceeds my line width / across
// multiple lines
Run Code Online (Sandbox Code Playgroud)

vim似乎包括最后一个斜杠作为文本的一部分,并没有认识到它构成了评论的一部分.我怎样才能解决这个问题?当我选择三次斜杠评论并按时,我看到的包装结果gq: …

c++ vim

18
推荐指数
1
解决办法
568
查看次数

你什么时候使用std :: unordered_map :: emplace_hint?

我知道如何使用std::unordered_map::emplace,但我该如何使用emplace_hintcpluspluscppreference都没有提供一组示例来说明我们如何知道放置元素的位置.

任何人都可以提供一些有关这方面的信息,或者提供一些示例/插图,告诉我们什么时候可以知道布置元素应该去哪里?

c++ stl unordered-map c++11

17
推荐指数
1
解决办法
3085
查看次数

如何为有符号整数类型创建用户定义的文字?

正如我从已发现此信息是允许用户定义的文本类型的参数类型,如下所示:

const char*
unsigned long long int
long double
char
wchar_t
char16_t
char32_t
const char*, std::size_t
const wchar_t*, std::size_t
const char16_t*, std::size_t
const char32_t*, std::size_t
Run Code Online (Sandbox Code Playgroud)

好吧,我在该列表中看到的唯一有符​​号整数是char,它太小了.如果我想做这样的事情怎么办?

str operator"" _i(int i) {
    return i*2;
}
Run Code Online (Sandbox Code Playgroud)

然后,当我写作时,-1000_i我希望得到-2000.我该怎么做呢?

c++ c++11

16
推荐指数
1
解决办法
992
查看次数

如何在编译时检查函数是否被调用

我试图在编译时确定是否调用了一个函数.具体来说,我想抛出静态断言失败,如果它是:

template <typename T>
auto Function(T value) -> std::enable_if<someCondition, int>
{
  // this is the function I want to call
}

template <typename... T>
int Function(T...)
{
  // This function should never be called, instead I want
  // a compile-time failure if this is called, because it
  // means the above function wasn't successfully resolved.
}
Run Code Online (Sandbox Code Playgroud)

我想这样做的原因是因为无法正确调用Function()正确的条件会导致数千行编译器错误消息,对于那些不熟悉代码库的人来说,这些消息都没有用.

我不希望把一个原因static_assertFunction,因为我们有很多的这些功能,我们有办法,而不是生成Catch-all通过宏,这避免了代码库的不必要的生长,同时产生更多的错误信息帮助版本.

可以这样做吗?

c++

16
推荐指数
1
解决办法
5506
查看次数

为什么C++类型默认不是const?

大师到处告诉我们const一切,除非我们需要对其进行修改,但标准使一切可变的,直到我们宣布const.

我在这里遗漏了什么,或者这是一个矛盾吗?const根据专家(其中一些人可能设计标准),默认情况下,为什么不是C++类型,默认情况下应该制作 const

c++

14
推荐指数
2
解决办法
2139
查看次数

如何减少大型模板的编译时内存占用?

假设我有一个包含大量其他类声明的类.是否有可能以某种方式分散这些成本,以便嵌套类型的编译时内存消耗不会以二次方式增长?如果需要的话,我愿意在编译时受到打击,如果可以选择的话,我很乐意把它分成不同的翻译单元.

为了尝试找到解决方案,我编写了以下程序,该程序说明了导致这些井喷的代码类型的简化版本:

// Add T to the list of args of SeqWithArgs N number of times:
template <int N, typename T, typename SeqWithArgs>
struct Append;

template <int N, typename T, template <typename...> class Seq, typename... Args>   
struct Append<N, T, Seq<Args...>>                                                  
{                                                                                  
    using type = typename Append<N-1, T, Seq<Args..., T>>::type;                   
};                                                                                 

template <typename T, template<typename...> class Seq, typename... Args>           
struct Append<0, T, Seq<Args...>>                                                  
{                                                                                  
    using type = Seq<Args...>;                                                     
};                                                                                 

static constexpr const int N = 10;                                              

// Tuple containing …
Run Code Online (Sandbox Code Playgroud)

c++ templates

14
推荐指数
1
解决办法
1952
查看次数