我在一个项目中大量使用 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。
这两种方法有什么不同吗?
在不同数字类型之间进行投射的最佳做法是什么?类型float
,double
,int
是+ +我使用C中的大多数人.
选项的一个示例,其中f
a float
和n
是double
或者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++开发社区是否有任何共识.
我很欣赏这可能最终成为一个基于意见的问题而且可能没有"标准"的方式,在这种情况下请告诉我没有标准方法,所以至少我知道:-)
我知道这个问题已经出现了相对于一般的铸造,但是,我对数字特别有兴趣和是否有针对数种办法具体的最佳实践.
我正在将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中编写此内容时,我是否只是在理解事情如何工作方面犯了一个根本错误?
考虑以下类foo1
和foo2
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++表达式模板来简化编写在值数组上运行的SSE2和AVX代码.
我有一个svec
代表一组值的类.
我有一个sreg
代表SSE2双重寄存器的类.
我有expr
并add_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) 如果您锁定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.
我有一个名为Push
C++ 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++的新手.
我有一个模板功能:
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方法来为命名空间中的函数创建缩短的别名?
我在 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) 我有以下类(剥离以仅包含相关部分):
#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++的新手.