小编kei*_*ith的帖子

在 C++ 中函数 SFINAE 的方法

我在一个项目中大量使用 SFINAE 函数,但不确定以下两种方法(样式除外)之间是否存在任何差异:

#include <cstdlib>
#include <type_traits>
#include <iostream>

template <class T, class = std::enable_if_t<std::is_same_v<T, int>>>
void foo()
{
    std::cout << "method 1" << std::endl;
}

template <class T, std::enable_if_t<std::is_same_v<T, double>>* = 0>
void foo()
{
    std::cout << "method 2" << std::endl;
}

int main()
{
    foo<int>();
    foo<double>();

    std::cout << "Done...";
    std::getchar();

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

程序输出如预期:

method 1
method 2
Done...
Run Code Online (Sandbox Code Playgroud)

我已经看到方法 2 在 stackoverflow 中使用得更频繁,但我更喜欢方法 1。

这两种方法有什么不同吗?

c++ sfinae

45
推荐指数
2
解决办法
1889
查看次数

C++中用于在数字类型之间进行转换的最佳实践

在不同数字类型之间进行投射的最佳做法是什么?类型float,double,int是+ +我使用C中的大多数人.

选项的一个示例,其中fa floatndouble或者int:

float f = static_cast<float>(n);
float f = float(n);
float f = (float)n;
Run Code Online (Sandbox Code Playgroud)

我经常写,static_cast<T>(...)但想知道如果有一种首选方式,C++开发社区是否有任何共识.

我很欣赏这可能最终成为一个基于意见的问题而且可能没有"标准"的方式,在这种情况下请告诉我没有标准方法,所以至少我知道:-)

我知道这个问题已经出现了相对于一般的铸造,但是,我对数字特别有兴趣和是否有针对数种办法具体的最佳实践.

c++ casting numeric-conversion

11
推荐指数
1
解决办法
7661
查看次数

ASP.NET Core 2.0中的多个身份

我正在将ASP.NET Core 1.0应用程序迁移到ASP.NET Core 2.0.

在我的启动中,我正在配置两个身份:

services.AddIdentity<IdentityUser, IdentityRole>(configureIdentity)
   .AddDefaultTokenProviders()
   .AddUserStore<IdentityUserStore<IdentityUser>>()
   .AddRoleStore<IdentityRoleStore<IdentityRole>>();

services.AddIdentity<Customer, CustomerRole>(configureIdentity)
   .AddDefaultTokenProviders()
   .AddErrorDescriber<CustomerIdentityErrorDescriber>()
   .AddUserStore<CustomerStore<Customer>>()
   .AddRoleStore<CustomerRoleStore<CustomerRole>>();
Run Code Online (Sandbox Code Playgroud)

这在ASP.NET Core 1.0中运行良好,但失败并出现错误:System.InvalidOperationException:' ASP.NET 已存在:Identity.Application'在ASP.NET Core 2.0中.

在ASP.NET Core 2.0中,如果我删除其中一个对AddIdentity错误的调用就会消失.如何迁移我的代码,以便在我的应用程序中使用两种不同类型的身份用户和角色?或者,当我在ASP.NET Core 1.0中编写此内容时,我是否只是在理解事情如何工作方面犯了一个根本错误?

c# asp.net-core asp.net-core-identity

11
推荐指数
2
解决办法
5095
查看次数

在C++中将通用构造函数赋给成员变量时,std :: move或std :: forward

考虑以下类foo1foo2

template <typename T>
struct foo1
{
    T t_;

    foo1(T&& t) :
        t_{ std::move(t) }
    {
    }
};

template <typename T>
struct foo2
{
    foo1<T> t_;

    foo2(T&& t) :
        t_{ std::forward<T>(t) }
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

始终是构造函数foo1表示初始化成员变量的正确方法T吗?即通过使用std::move.

总是这样的构造函数foo2表示foo1<T>由于需要转发到foo1的构造函数而初始化成员变量的正确方法吗?即通过使用std::forward.

更新

以下示例无法foo1使用std::move:

template <typename T>
foo1<T> make_foo1(T&& t)
{
    return{ std::forward<T>(t) };
}

struct bah {};

int main()
{
    bah b;

    make_foo1(b); // compiler …
Run Code Online (Sandbox Code Playgroud)

c++ move-semantics perfect-forwarding c++11 c++14

10
推荐指数
1
解决办法
951
查看次数

包含内在函数的简单C++表达式模板会产生不同的指令

我正在测试一个非常简单的程序,该程序使用C++表达式模板来简化编写在值数组上运行的SSE2和AVX代码.

我有一个svec代表一组值的类.

我有一个sreg代表SSE2双重寄存器的类.

我有expradd_expr代表添加svec数组.

与手动代码相比,编译器为每个循环生成三个额外的指令用于表达式模板测试用例.我想知道是否有这样的原因,或者我可以做任何改变让他编译器产生相同的输出?

完整的测试工具是:

#include <iostream>
#include <emmintrin.h>

struct sreg
{
    __m128d reg_;

    sreg() {}

    sreg(const __m128d& r) :
        reg_(r)
    {
    }

    sreg operator+(const sreg& b) const
    {
        return _mm_add_pd(reg_, b.reg_);
    }
};

template <typename T>
struct expr
{
    sreg operator[](std::size_t i) const
    {
        return static_cast<const T&>(*this).operator[](i);
    }

    operator const T&() const
    {
        return static_cast<const T&>(*this);
    }
};

template <typename A, typename B>
struct add_expr : public expr<add_expr<A, …
Run Code Online (Sandbox Code Playgroud)

c++ intrinsics

9
推荐指数
1
解决办法
226
查看次数

一旦std :: weak_ptr上的锁定返回nullptr,它是否可以再次为非null?

如果您锁定std::weak_ptr:

    class foo {};

    auto s = std::make_shared<foo>();

    std::weak_ptr<foo> w{ s };

    s = nullptr;

    s.reset(new foo());

    auto l = w.lock(); // try to get previous foo

    std::cout << "locked: " << (l != nullptr) << std::endl;
Run Code Online (Sandbox Code Playgroud)

输出:

locked: 0
Run Code Online (Sandbox Code Playgroud)

一旦锁定返回nullptr,是否有一个条件可以返回非null,或者它是否有效死了?

我的测试程序建议,一旦最初分配的对象的引用计数为零,则为no,weak_ptr将始终返回nullptr.

c++ c++11

8
推荐指数
2
解决办法
357
查看次数

std :: move或std :: forward,参数为std :: unique_ptr <T> &&

我有一个名为PushC++ 11中编写的方法的以下模板类(剥离以仅包含相关部分):

template<class T, int Capacity>
class CircularStack
{
private:
    std::array<std::unique_ptr<T>, Capacity> _stack;

public:
   void Push(std::unique_ptr<T>&& value)
   {
      //some code omitted that updates an _index member variable

      _stack[_index] = std::move(value);
   }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

我应该使用std::move还是std::forward在内Push

我不确定是否std::unique_ptr<T>&&有资格作为通用参考,因此应该使用forward而不是move.

我是C++的新手.

c++ c++11

7
推荐指数
1
解决办法
751
查看次数

如何使用C++ 11使用关键字作为模板函数来删除范围中的命名空间

我有一个模板功能:

namespace Example
{
template<class T>
T Foo() { return T(0); };
}
Run Code Online (Sandbox Code Playgroud)

我想使用一个using语句或类似的语句,以便在调用它时,我不必在函数名称前加上它的命名空间

template<class T> using Foo = Example::Foo<T>;
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

并不想用下面的办法,因为这将包括一切形式的命名空间Example:

using namespace Example;
Run Code Online (Sandbox Code Playgroud)

有没有一个很好的C++ 11方法来为命名空间中的函数创建缩短的别名?

c++ c++11

7
推荐指数
1
解决办法
1199
查看次数

在 macOS 上将 -fuse-ld=lld 与 Clang 结合使用

我在 macOS 10.15 上使用 Clang 10(不是 AppleClang),并尝试通过-fuse-ld=lld在 CMake flags 中指定来与 LLD 链接CMAKE_EXE_LINKER_FLAGS

但是,当我尝试使用 LLD 时,出现以下错误:

The C++ compiler

"/Users/XXX/llvm/bin/clang++"

is not able to compile a simple test program.

It fails with the following output:

ld64.lld: warning: ignoring unknown argument: -platform_version
ld64.lld: warning: ignoring unknown argument: -search_paths_first
ld64.lld: warning: ignoring unknown argument: -headerpad_max_install_names
ld64.lld: warning: -sdk_version is required when emitting min version load command.  Setting sdk version to match provided min version
ld64.lld: error: Unable to find …
Run Code Online (Sandbox Code Playgroud)

c++ macos cmake clang lld

7
推荐指数
1
解决办法
1万
查看次数

具有隐式转换运算符的类上的static_cast <>行为,该运算符返回const引用

我有以下类(剥离以仅包含相关部分):

#include <string>

class Text
{
private:
    std::string _text;

public:
    Text(std::string&& text) :
        _text(std::move(text))
    {
    }

    operator const std::string&() const
    {
        return _text;
    }
};
Run Code Online (Sandbox Code Playgroud)

我的问题是:如果我想获得一个const std::string&,我可以这样做而不会受到任何惩罚:

 Text text("fred");

 auto& s = static_cast<std::string>(text);
Run Code Online (Sandbox Code Playgroud)

或者这将构建一个std::string我最终获得引用的中间体?这种情况是否有标准方法?我是C++的新手.

c++ c++11

6
推荐指数
1
解决办法
452
查看次数