using SFINAE rather than assert in case alternate declarations are needed