我有一个类来描述某种类型的特征.
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而无需重复min和max?
我已经创建了一个接口,以便我可以尝试使一些重复的代码通用.
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#等价物?