小编mad*_*soj的帖子

专门化静态constexpr数据成员

我有一个类来描述某种类型的特征.

template<typename T>
struct my_traits
{
    static constexpr int some_trait = 0;

    static constexpr T min() { return std::numeric_limtis<T>::min(); }
    static constexpr T max() { return std::numeric_limits<T>::max(); }
};
Run Code Online (Sandbox Code Playgroud)

我想专攻my_traits::some_trait,但当我尝试:

template<> constexpr int my_traits<int>::some_trait = 1;
Run Code Online (Sandbox Code Playgroud)

编译器抱怨my_traits::some_trait已经有一个初始化器.当然,我可以通过以下方式专门化它:

template<>
struct my_traits<int>
{
    static constexpr int some_trait = 1;

    // min and max
};
Run Code Online (Sandbox Code Playgroud)

但是我必须重新定义所有其他功能,即使它们完全相同.

所以,我怎么可以专注my_traits<int>::some_trait而无需重复minmax

c++ template-specialization c++14

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

为什么类型推断不能从约束中确定类型

我已经创建了一个接口,以便我可以尝试使一些重复的代码通用.

public interface IIdentifiable<T>
{
    T Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个与实体一起工作的类,其约束条件为 IIdentifiable<T>

public class MyClass<TEntity, TId>
    where TEntity : IIdentifiable<TId> {}
Run Code Online (Sandbox Code Playgroud)

但是现在每当我使用时MyClass我都必须传入,TId即使只有一种有效类型TId.

public class MyEntity : IIdentifiable<Guid> {}

var foo = new MyClass<MyEntity>(); // Error
var bar = new MyClass<MyEntity, Guid>();
Run Code Online (Sandbox Code Playgroud)

在C++中我可以这样做:

template<typename T>
struct IIdentifiable
{
    using id_type = T;

    T id;
};

template<typename TEntity, typename TId = typename TEntity::id_type>
struct MyClass {};

MyClass<MyEntity> foo;
Run Code Online (Sandbox Code Playgroud)

是否有C#等价物?

c# generics

2
推荐指数
1
解决办法
64
查看次数

标签 统计

c# ×1

c++ ×1

c++14 ×1

generics ×1

template-specialization ×1